如何使用已删除的复制构造函数初始化类数组(C++ 11)

Joh*_*ren 12 c++ arrays gcc clang c++11

关于为什么我不能初始化对象数组(如果它们有私有拷贝构造函数)的现有问题特指C++ 03.我从那个问题中知道我在C++ 03中不允许做什么,但我认为它应该可以在C++ 11中实现

我有一个不可移动的类(称之为Child),我需要在另一个类的构造函数中初始化一个Child数组(称之为Parent)."不可移动"是指在该对象的生命周期内,Child对象的地址必须保持不变.这样做的正确方法是什么?

使用C++ 11,我尝试了以下内容:

class Child
{
public:
    Child (int x) {}
    ~Child () {}

    Child (const Child &) = delete;
};

class Parent
{
public:
    Parent () : children {{5}, {7}} {}

private:
    Child children[2];
};
Run Code Online (Sandbox Code Playgroud)

此代码与Clang 3.5.0编译良好,但GCC 4.9.1抱怨我正在尝试使用已删除的复制构造函数:

test.cc: In constructor ‘Parent::Parent()’:
test.cc:13:35: error: use of deleted function ‘Child::Child(const Child&)’
     Parent () : children {{5}, {7}} {}
                                   ^
test.cc:7:5: note: declared here
     Child (const Child &) = delete;
     ^
Run Code Online (Sandbox Code Playgroud)

我已经读过复制初始化和直接初始化之间的区别(例如这里这里),我想避免使用直接初始化来调用复制构造函数.我的语法错了吗?这是GCC中的错误吗?或者我正在尝试做什么是不可能的?

Jon*_*ely 4

我同意这似乎是一个 GCC 错误(报告为63707 )的评论。

仅当数组中的类型具有用户定义的析构函数时,它才会编译失败,这对我来说没有意义。