我正在尝试使用现有的类类型为类定义一个成员变量,该类将删除其副本构造函数。当我尝试定义成员变量时,出现编译时错误
test2.cpp:25:24: error: use of deleted function 'UseDelDef::UseDelDef(UseDelDef&&)
但是,当我改为定义局部变量时,没有问题。我意识到成员变量的定义正在调用该类的默认构造函数...如何在不更改现有类的情况下解决此问题?我有点c ++ n00b ...;)
这是test2.cpp的代码:
class DelDef
{
public:
DelDef() {}
private:
DelDef(const DelDef &other) = delete;
};
class UseDelDef
{
public:
UseDelDef()
{
// This is fine...
DelDef del_def;
}
private:
// This calls the default constructor
// causes a compile error 'use of deleted function'
DelDef m_del_def;
};
int main()
{
auto udd = UseDelDef();
}
// This is fine... DelDef del_def;
这很好,因为它使用默认初始化。 DelDef
和UseDelDef
都是默认可初始化的。
auto udd = UseDelDef();
在C ++ 17之前,此默认值初始化一个临时UseDelDef
(可以),然后复制初始化udd
(通过移动)。这是不正确的格式,因为UseDelDef
不可移动(因为DelDef
不可移动(由于已删除的副本构造函数))。
自C ++ 17起,程序格式正确,因为udd
直接从用于初始化prvalue表达式的表达式中初始化。您可以像使用构造函数中一样,使用默认初始化简单地针对C ++ 17之前的版本进行修复:
int main()
{
UseDelDef udd;
}