我在初始化聚合测试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构造函数的标准要求吗?

最佳答案

不调用拷贝或移动构造函数是标准专门允许的优化(但不是必需的)。

为了在各个编译器之间保持一致,如果实现不希望对其进行优化,则实现必须检查该构造函数是否已被调用。

09-20 17:01