«Копировать инициализацию» в C ++ не означает, что вещи обязательно будут скопированы. Это просто формальное имя для ограничений, при которых будет происходить инициализация. Например, при инициализации копирования явные c 'кандидаты не являются кандидатами. Таким образом, следующий код будет неправильно сформирован
#include <iostream>
#include <initializer_list>
struct A {
explicit A() = default;
A(const A&){ std::cout << "Oh no, a copy!\n"; }
};
struct B { B(std::initializer_list<A> il); };
int main()
{
B b{ {} };
return 0;
}
Единственный элемент в списке должен инициализироваться копией из {}
, что влечет за собой вызов по умолчанию c ' тор. Однако, поскольку c 'отмечен явно, эта инициализация не может произойти.
Исключение копирования, безусловно, возможно до C ++ 17 и обязательно в C ++ 17 и выше в определенных контекстах. В вашем примере под компилятором C ++ 17, поскольку вы предоставляете инициализатор, который является prvalue (чистое значение, а не объект), правила инициализации C ++ требуют, чтобы цель инициализировалась напрямую , без промежуточных объектов. Несмотря на то, что контекст называется «инициализация копирования», лишних объектов нет.