我在初始化聚合测试another question的一些东西时遇到了这个问题。我正在使用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; }
};
运行时,不会打印任何消息。但是,如果我将move构造函数设为私有(private),则编译器会提示
‘Goo::Goo(Goo&&)’ is private
,尽管显然不需要move构造函数。有人知道这样的聚合初始化是否可以访问move构造函数的标准要求吗?
最佳答案
不调用拷贝或移动构造函数是标准专门允许的优化(但不是必需的)。
为了在各个编译器之间保持一致,如果实现不希望对其进行优化,则实现必须检查该构造函数是否已被调用。