【问题标题】:compiler defined move constructor with destructor编译器用析构函数定义移动构造函数
【发布时间】:2019-06-16 01:20:52
【问题描述】:

根据 cpp 参考 cpp-ref,如果我们有用户定义的析构函数,编译器不会生成默认的移动构造函数。

代码sn-p:

 class General
{
public:
    ~General();
    General();
    void testInitList();
};

int main(int argc, char **argv) {
    General b(std::move(General()));
    General g = std::move(b);
    g.testInitList();
    return 0;
}

代码编译意味着编译器生成了一个默认的移动构造函数。代码使用 gcc 版本 5.4.0 编译。

有人可以解释为什么编译器在这种情况下生成了一个移动构造函数和移动赋值运算符,尽管有一个析构函数?

最好, 拉胡尔

【问题讨论】:

  • 首先,它编译。其次,我在构造函数和析构函数中有打印语句。只打印了一个构造函数语句,而打印了多个析构函数语句。
  • 您没有定义复制构造函数,这就是您没有足够的打印的原因。
  • 嗯。好的,让我试试。
  • 是的,你是对的。非常感谢您的帮助

标签: c++ move-constructor


【解决方案1】:

当没有移动构造函数或赋值运算符时,不执行移动。 std::move 不执行移动。它只是将其参数转换为指示移动可能如果可能。如果不可能,那么就没有动作,使用std::move 什么都不做。

【讨论】:

  • 我在构造函数和析构函数中有打印语句。仅打印了一个构造函数语句,而打印了多个析构函数语句。这意味着对象确实被移动了。输出 - 创建将军 销毁将军 销毁将军 销毁将军
  • 了解我在哪里犯了错误。非常感谢 Nikos。
  • @RGs 您的代码调用默认构造函数和隐式定义的复制构造函数。所以是的,只会打印一个。定义一个复制构造函数并在那里打印一些东西。
猜你喜欢
  • 2017-11-18
  • 2019-04-16
  • 2015-02-21
  • 2010-10-17
  • 2015-06-30
  • 1970-01-01
  • 2013-03-13
  • 2011-05-22
  • 1970-01-01
相关资源
最近更新 更多