Неопределенность между инициализацией по умолчанию и инициализацией значения - PullRequest
12 голосов
/ 27 июня 2019

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

Вот пример:

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 Ответ

4 голосов
/ 27 июня 2019

A a; - это инициализация по умолчанию , поскольку для инициализации используется конструктор по умолчанию A.Поскольку неявно сгенерированный конструктор по умолчанию из A ничего не делает, a.x имеет неопределенное значение.

A() равно инициализации значения ,

если T является типом класса с конструктором по умолчанию, который не предоставлен и не удален пользователем (то есть это может быть класс с неявно определенным или дефолтным конструктором по умолчанию), объект равен нулю-initialized , а затем он инициализируется по умолчанию , если он имеет нетривиальный конструктор по умолчанию;

Обратите внимание на разницу с инициализацией по умолчанию ,A имеет неявно определенный конструктор по умолчанию, а объект инициализируется нулями ;поэтому элемент данных x временного объекта A() будет инициализирован в 0.

A b = A(); равен копия инициализации , в концепции b инициализируется извременный объект A(), поэтому b.x будет также инициализирован до 0.Обратите внимание, что из-за copy elision , поскольку C ++ 17 b гарантированно инициализируется значением напрямую;конструкция копирования / перемещения опущена.

int value = 4; равно инициализация копирования .value будет инициализирован до 4.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...