Неопределенность между инициализацией по умолчанию и инициализацией значения
Я нашел много статей, объясняющих различие между "инициализацией по умолчанию и инициализацией значения", но на самом деле я не совсем понял.
Вот пример:
class A{
public:
int x;
};
int main(){
A a;// default initialization so x has undefined value.
A b = A(); // value initialization so x is a scalar thus it is value initialized to 0
}
Выше это нормально, как я думаю, но здесь:
int value = 4; // is this considered a value-initialization?
Пожалуйста, помогите мне понять основные различия между двумя формами инициализации.
1 ответ
A a;
является инициализацией по умолчанию, так как эффект конструктора по умолчанию A
используется для инициализации. Поскольку неявно сгенерированный конструктор по умолчанию A
ничего не делает, a.x
имеет неопределенное значение.
A()
это инициализация значения,
если T является типом класса с конструктором по умолчанию, который не предоставлен и не удален пользователем (то есть это может быть класс с неявно определенным или дефолтным конструктором по умолчанию), объект инициализируется нулями, а затем он устанавливается по умолчанию. инициализируется, если у него есть нетривиальный конструктор по умолчанию;
Обратите внимание на разницу с инициализацией по умолчанию, A
имеет неявно определенный конструктор по умолчанию, а объект инициализируется нулями; поэтому член данных x
временного объекта A()
будет инициализирован в 0
,
A b = A();
это инициализация копии, в концепции b
инициализируется из временного объекта A()
, так b.x
будет инициализирован в 0
слишком. Обратите внимание, что из-за исключения копирования, так как C++17 b
гарантированно инициализируется значением напрямую; конструкция копирования / перемещения опущена.
int value = 4;
это тоже инициализация копии. value
будет инициализирован в 4
,