Рассмотрим простую инструкцию (взято из Есть ли разница в С++ между инициализацией копирования и прямой инициализацией?:
A c2 = A();
Значение этого оператора инициализирует временные, а затем копии, которые значение в c2 (см. 5.2.3/2 и 8.5/14). Это, конечно, потребует неявный конструктор копирования (см. 8.5/14 и 12.3.1/3 и 13.3.1.3/1)
[Обратите внимание на смелое предложение в параграфе] → Мой вопрос: почему?
Теперь рассмотрим этот код:
class B {};
struct A
{
A(B const&) {}
A(A const&) = delete;
//A(A const&); //delete above statement and uncomment this statement,
//and everything works, even though there in no body of copy constructor Oo
};
A a2 = B(); //error since there is no copy constructor oO
Почему для копирования-инициализации требуется наличие конструктора копирования, хотя он не нужен когда-то, как представлено в приведенном выше коде
Пожалуйста, пожалуйста, еще одна вещь:
В то время как прямая инициализация имеет все конструкторы, доступные для вызова, и, кроме того, может выполнять любое неявное преобразование, которое должно соответствовать типы аргументов, инициализация копирования может просто настроить один неявный последовательность преобразования.
[ Обратите внимание на жирный шрифт в следующем параграфе]
Не означает ли это, что прямая инициализация имеет доступ ко всем конструкторам и может выполнять неявную последовательность преобразований, в то время как все инициализация копирования может выполнять только неявная последовательность преобразований?, Я хочу спросить, неявное преобразование в прямой инициализации отличается от неявной последовательности преобразований при инициализации копии?