为什么类成员变量调用已删除的副本构造函数,而局部变量调用构造函数?

问题描述 投票:0回答:1

我正在尝试使用现有的类类型为类定义一个成员变量,该类将删除其副本构造函数。当我尝试定义成员变量时,出现编译时错误

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();
}
c++ constructor copy default
1个回答
0
投票
// This is fine...
DelDef del_def;

这很好,因为它使用默认初始化。 DelDefUseDelDef都是默认可初始化的。

auto udd = UseDelDef();

在C ++ 17之前,此默认值初始化一个临时UseDelDef(可以),然后复制初始化udd(通过移动)。这是不正确的格式,因为UseDelDef不可移动(因为DelDef不可移动(由于已删除的副本构造函数))。

自C ++ 17起,程序格式正确,因为udd直接从用于初始化prvalue表达式的表达式中初始化。您可以像使用构造函数中一样,使用默认初始化简单地针对C ++ 17之前的版本进行修复:

int main()
{
    UseDelDef udd;
}
© www.soinside.com 2019 - 2024. All rights reserved.