Я сталкивался с этим при тестировании некоторых вещей для другого вопроса об инициализации агрегатов. Я использую GCC 4.6.
Когда я инициализирую агрегат со списком, все элементы создаются на месте, без копирования или перемещения. Для остроумия:
int main()
{
std::array<std::array<Goo,2>,2>
a { std::array<Goo,2>{Goo{ 1, 2}, Goo{ 3, 4}} ,
std::array<Goo,2>{Goo{-1,-2}, Goo{-3,-4}} };
}
Давайте подтвердим, сделав несколько шумных конструкторов:
struct Goo
{
Goo(int, int) { }
Goo(Goo &&) { std::cout << "Goo Moved." << std::endl; }
Goo(const Goo &) { std::cout << "Goo Copied." << std::endl; }
};
После запуска сообщения не печатаются. Однако, если я сделаю конструктор перемещения закрытым, компилятор пожалуется на ‘Goo::Goo(Goo&&)’ is private
, хотя конструктор перемещения явно не нужен.
Кто-нибудь знает, существует ли стандартное требование, чтобы конструктор перемещения был доступен для агрегатной инициализации, подобной этой?