Концептуально ли инициализация списка копирования вызывает 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 не стоит на пути.