Ответ 1
По умолчанию конструктор копирования и оператор присваивания используют построение копирования и назначение отдельно для каждого члена. Когда имеется массив, построение копирования или присваивание используются для каждого элемента массива (который довольно четко определен).
Здесь правило, из раздела 12.8 ([class.copy]
):
Неявно определенный конструктор copy/move для неединичного класса
X
выполняет поэтапную копирование/перемещение своих баз и элементов. [Примечание: скопированные или равные инициализаторы нестатических членов данных игнорируются. См. Также пример в 12.6.2. - end note] Порядок инициализации совпадает с порядком инициализации баз и членов в определяемом пользователем конструкторе (см. 12.6.2). ПустьX
- либо параметр конструктор или, для конструктора перемещения, значение x, относящееся к параметру. Каждый базовый или нестатический элемент данных копируется/перемещается в соответствии с его типом:
- , если элемент является массивом, каждый элемент инициализируется напрямую с соответствующим подобъектом
X
;- если элемент m имеет ссылочный тип rvalue
T&&
, он инициализируется с помощьюstatic_cast<T&&>(x.m)
;- в противном случае база или элемент инициализируются с прямой базой или элементом
X
.
и
Неявно определенный оператор присваивания копирования/перемещения для неединичного класса
X
выполняет поэтапное копирование/перемещение назначения своих подобъектов. Прямые базовые классыX
назначаются первыми в порядке их объявления в списке-спецификаторе-базовом, а затем присваиваются непосредственные нестатические элементы данныхX
в том порядке, в котором они были объявлены в определении класса. ПустьX
- либо параметр функции, либо оператор перемещения - значение x, относящееся к параметру. Каждый подобъект присваивается в соответствии с его типом:
- если подобъект имеет тип класса, как если бы вызывал оператор = с подобъектом как выражение объекта и соответствующий подобъект x как один аргумент функции (как если бы он был явно квалифицирован, т.е. игнорировал любые возможные виртуальные функции переопределения в более производных классах);
- , если подобъектом является массив, каждый элемент назначается в соответствии с типом элемента;
- Если подобъект имеет скалярный тип, используется встроенный оператор присваивания.
Правило выбора подписи между C::C(const C&)
vs C::C(C&)
et al также включает язык, относящийся к типу элемента массива.