Ответ 1
В конце концов, он не является темным, см. выделенные части выдержки стандартов:
Раздел о дефолтных конструкторах копирования/перемещения (§ 12.8) является слишком длинным, чтобы процитировать его целиком. Низкий уровень - это то, что поля нестатического элемента с инициализаторами по-прежнему просто копируются конструктором copy/move по умолчанию
§ 12.8:
-6. Неявно заданный конструктор копирования/перемещения для неединичного класса X выполняет поэтапную копию/перемещение его баз и членов.
[ Note: brace-or-equal-initializers of non-static data members are ignored. See also the example in 12.6.2. —end note ]
Порядок инициализации совпадает с порядком инициализации баз и членов в определяемом пользователем конструкторе (см. 12.6.2). Пусть x - либо параметр конструктор или, для конструктора перемещения, значение x, относящееся к параметру. Каждая базовая или нестатическая информация член копируется/перемещается в соответствии с его типом:
- если элемент является массивом, каждый элемент инициализируется прямым образом с соответствующим подобъектом x;
- если элемент m имеет ссылочный тип rvalue T & &, он напрямую инициализируется static_cast (x.m);
- в противном случае база или элемент напрямую инициализируются с соответствующей базой или членом x.
Субообъекты виртуального базового класса должны быть инициализированы только один раз неявно определенным конструктором copy/move
Это образец, на который ссылается:
struct A { int i = /* some integer expression with side effects */; A(int arg) : i(arg) { } // ... };
Конструктор A (int) будет просто инициализировать я до значения arg, а побочные эффекты в нем - скобки или -регулятор.
—end example ]
Для полноты, соответствующий раздел по умолчанию по умолчанию:
§ 12.1
-6. Конструктор по умолчанию, который по умолчанию и не определен как удаленный, неявно определяется, когда он используется odr (3.2) для создания объекта его типа класса (1.8) или когда он явно дефолт после его первого объявления.
Неявно определенный конструктор по умолчанию выполняет набор инициализаций класса, который будет выполняться написанным пользователем конструктором по умолчанию для этого класса без инициализатора ctor (12.6.2) и пустого соединение-оператор. Если этот пользовательский конструктор по умолчанию будет плохо сформирован, программа будет плохо сформирована.
Если этот пользовательский конструктор по умолчанию будет удовлетворять требованиям конструктора constexpr (7.1.5), неявно определенный конструктор по умолчанию - constexpr. Перед стандартным конструктором по умолчанию для класс неявно определен, все конструкторы по умолчанию, не предоставляемые пользователем, для его базовых классов и его нестатических члены данных должны быть неявно определены. [Примечание. Неявно объявленный конструктор по умолчанию имеет спецификацию исключения (15.4).
Явное определение по умолчанию может иметь неявную спецификацию исключений, см. 8.4.—end note ]