Ответ 1
Эта формулировка добавлена в документ P0398R0, который предназначен для описания следующего случая:
Z c = {};
для неагрегата Z
Например, я предполагаю, что я понимаю, что инициализация списка в контексте прямой инициализации (vs copy-) означает - int x{}
vs int x = {}
принципе.
Но на cppreference я нашел это:
Когда объектом типа класса является copy-, инициализированным из объекта того же или производного типа класса или инициализированным по умолчанию в контексте инициализации copy-, все функции-кандидаты являются всеми конструкторами преобразования инициализируемого класса. Список аргументов - это выражение инициализатора.
Думаю, я понимаю, почему кандидаты преобразуют конструкторы для первого случая, но не для второго. Я имею в виду, что я не могу написать что-то вроде MyClass x = MyClass
, а = MyClass()
будет инициализацией значения, а = MyClass(args...)
будет прямой инициализацией.
И даже если такая конструкция существует, я не понимаю, почему временный объект MyClass
"construction" должен включать в себя все конструкторы преобразования.
(И x
это не то, о чем мы говорили здесь, как я вижу, потому что это определенно copy- построено, а не построено по умолчанию).
Поэтому, я думаю, я смущен здесь.
Эта формулировка добавлена в документ P0398R0, который предназначен для описания следующего случая:
Z c = {};
для неагрегата Z
Это означает, что при инициализации объекта он не создается по умолчанию и затем копируется с использованием оператора присваивания, но всегда сразу создается из параметров, заданных в инициализации. Поэтому при использовании нотации присваивания используются только преобразования.
Пример: с учетом класса:
class MyClass
{
MyClass();
MyClass(int);
};
Следующий оператор вызывает вызов MyClass :: MyClass (int) и конструктор по умолчанию.
MyClass obj = 10;
MyClass obj{10};
MyClass obj = {10};