【发布时间】:2020-03-09 19:12:22
【问题描述】:
我需要使用非默认构造函数并且不使用复制构造函数来初始化类的成员数组。
我有以下两个类:
class MemberClass
{
public:
MemberClass(int id) { /* Do stuff */ }; // Define non-default ctor
MemberClass(const MemberClass& other) = delete; // Delete copy ctor
~MemberClass() { /* Do stuff */ }; // Overide default dtor
};
class ContainerClass
{
private:
MemberClass mem[2];
public:
ContainerClass(int id)
: mem { {id} , {id} }
{}
};
编译时出现以下错误:
error: use of deleted function ‘MemberClass::MemberClass(const MemberClass&)’
: mem { {id} , {id} }
但是如果不定义复制构造函数,我无法找到初始化mem 数组的方法。我从here 和here 中找到了答案,解释了复制省略正在发生并且需要复制ctor 来编译但应该被编译器删除。 MemberClass 永远不应该被复制,所以为这个初始化定义一个 copy-ctor 似乎很尴尬,而且在其他地方容易调试更困难。
如果MemberClass 仅具有默认构造函数,则编译器不会给出任何问题。如果mem 不是一个数组而只是一个MemberClass 对象,也不会出现任何问题。我唯一的问题是使用非默认 ctor 初始化这个数组,而不使用 copy-ctor。
奇怪的是,如果我不定义析构函数,我不会收到任何编译错误,这似乎是一个线索。
是否有一种“正确”的方式来进行这种初始化?
【问题讨论】:
-
你的班级可以移动吗? (显示的不是但不确定这是否是遗漏)
-
从您链接的帖子中,您可以声明复制构造函数而不定义它。
-
FWIW,它使用最新版本的 Clang 编译,但不是 GCC。
标签: c++ initialization copy-constructor datamember