Неопределенность между инициализацией по умолчанию и инициализацией значения

Я нашел много статей, объясняющих различие между "инициализацией по умолчанию и инициализацией значения", но на самом деле я не совсем понял.

Вот пример:

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,

Другие вопросы по тегам