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

标签 c++ arrays c++11 gcc clang

关于 Why can't I initialise an array of objects if they have private copy constructors? 的现有问题特指C++03。我从那个问题中知道我正在尝试做的事情在 C++03 中是不允许的,但我认为在 C++11 中应该是可能的

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

使用 C++11,我尝试了以下方法:

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

    Child (const Child &) = delete;
};

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

private:
    Child children[2];
};

这段代码在 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;
     ^

我已经了解了复制初始化和直接初始化之间的区别(例如 herehere),并且我想避免使用直接初始化来调用复制构造函数。我的语法错了吗?这是 GCC 中的错误吗?还是我试图做的事情是不可能的?

最佳答案

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

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

关于c++ - 如何使用已删除的复制构造函数初始化类数组(C++11),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26685551/

相关文章:

c++ - 使用空指针

c++ - 在 C 和 C++ 中的函数指针和对象指针之间转换

arrays - VBA 中的属性数组

c++ - 什么时候评估 'auto' 和 'decltype'?

c++ - 确定 "generic function"的返回类型

c++ - 通过引用返回一个 unique_ptr

c++ - WinAPI 确定文件是否可访问/私有(private)的方法

multithreading - C++原子内存顺序与线程事件,例如notify()

javascript - 如何让对象在数组中找到自己的索引?

java - 如何在java中将字符串从3维数组拆分为新的2维数组