Концептуально ли инициализация списка копирования вызывает copy ctor?

До C ++ 11 мы можем выполнить инициализацию копирования, написав что-то вродеA a = 1; что более или менее эквивалентноA a = A(1);, То есть сначала создается временный объект, а затем вызывается копия ctor. Независимо от разрешения копирования, это должно быть так концептуально, и копия ctor должна быть доступна.

При инициализации списка в C ++ 11 мы можем выполнить инициализацию списка копирования, написавA a = {1, 2};, На мой взгляд, это должно быть более или менее эквивалентноA a = A(1, 2);, Тем не менее, на GCC и лязг,A a = {1, 2} компилируется, даже когда ctor для копирования и перемещения недоступен (объявляется как private). Еще,A a = 1; не компилируется в GCC или clang, если соответствующий ctor копирования / перемещения недоступен. Так,A a = {1, 2}; кажется более или менее эквивалентнымA a{1, 2}; которая является прямой инициализацией списка. Разница между этим и реальной прямой инициализацией списка заключается в том, чтоA a = {1, 2}; не компилируется, если ctor, который принимает два целых числа, является явным. В этом аспектеA a = {1, 2}; напоминает инициализацию копирования.

Итак, мой вопрос: какова точная семантика выражений типаA a = {1, 2}; концептуально? ОтконцептуальноКопировать elision не стоит на пути.

Ответы на вопрос(1)

Ваш ответ на вопрос