Что означает "инициализация по умолчанию в контексте копирования-инициализации" в C++? - программирование
Подтвердить что ты не робот

Что означает "инициализация по умолчанию в контексте копирования-инициализации" в C++?

Например, я предполагаю, что я понимаю, что инициализация списка в контексте прямой инициализации (vs copy-) означает - int x{} vs int x = {} принципе.

Но на cppreference я нашел это:

Когда объектом типа класса является copy-, инициализированным из объекта того же или производного типа класса или инициализированным по умолчанию в контексте инициализации copy-, все функции-кандидаты являются всеми конструкторами преобразования инициализируемого класса. Список аргументов - это выражение инициализатора.

Думаю, я понимаю, почему кандидаты преобразуют конструкторы для первого случая, но не для второго. Я имею в виду, что я не могу написать что-то вроде MyClass x = MyClass, а = MyClass() будет инициализацией значения, а = MyClass(args...) будет прямой инициализацией.

И даже если такая конструкция существует, я не понимаю, почему временный объект MyClass "construction" должен включать в себя все конструкторы преобразования.

x это не то, о чем мы говорили здесь, как я вижу, потому что это определенно copy- построено, а не построено по умолчанию).

Поэтому, я думаю, я смущен здесь.

4b9b3361

Ответ 1

Эта формулировка добавлена в документ P0398R0, который предназначен для описания следующего случая:

Z c = {};

для неагрегата Z

Ответ 2

Это означает, что при инициализации объекта он не создается по умолчанию и затем копируется с использованием оператора присваивания, но всегда сразу создается из параметров, заданных в инициализации. Поэтому при использовании нотации присваивания используются только преобразования.

Пример: с учетом класса:

class MyClass
{
    MyClass();
    MyClass(int);
};

Следующий оператор вызывает вызов MyClass :: MyClass (int) и конструктор по умолчанию.

MyClass obj = 10;
MyClass obj{10};
MyClass obj = {10};