使用私有复制/移动构造函数进行聚合初始化

Ker*_* SB 4 c++ gcc initialization c++11

我在测试一些关于初始化聚合的问题时遇到了这个问题.我正在使用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}} };
}
Run Code Online (Sandbox Code Playgroud)

让我们通过制作一些嘈杂的构造函数来确认:

struct Goo
{
  Goo(int, int) { }
  Goo(Goo &&) { std::cout << "Goo Moved." << std::endl; }
  Goo(const Goo &) { std::cout << "Goo Copied." << std::endl; }
};
Run Code Online (Sandbox Code Playgroud)

运行时,不会打印任何消息.但是,如果我将移动构造函数设为私有,则编译器会抱怨‘Goo::Goo(Goo&&)’ is private,尽管显然不需要移动构造函数.

有没有人知道是否有一个标准的要求移动构造函数可以像这样进行聚合初始化?

Bo *_*son 8

不调用副本或移动构造函数是标准特别允许的优化(但不是必需的).

为了在编译器之间保持一致,实现必须检查构造函数是否可以被调用,如果它不关心优化它.