C++ 编译器定义的带析构函数的移动构造函数

C++ 编译器定义的带析构函数的移动构造函数,c++,move-constructor,C++,Move Constructor,根据cpp引用,如果我们有一个用户定义的析构函数,编译器不会生成默认的移动构造函数 代码段: class General { public: ~General(); General(); void testInitList(); }; int main(int argc, char **argv) { General b(std::move(General())); General g = std::move(b); g.testInitLis

根据cpp引用,如果我们有一个用户定义的析构函数,编译器不会生成默认的移动构造函数

代码段:

 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编译的

有人能解释一下为什么编译器在这种情况下生成了一个move构造函数和move赋值操作符,尽管它有一个析构函数

最好的,
Rahul

当没有移动构造函数或赋值运算符时,不会执行移动。不执行移动。它只是抛出它的参数,以表明如果可能,可以执行移动。如果不可能,那么就没有移动,使用
std::move
什么也不做。

首先,编译它。其次,我在构造函数和析构函数中有print语句。在打印多个析构函数语句的地方,只打印了一个构造函数语句。您没有定义副本构造函数,这就是为什么没有足够的打印。嗯。好的,让我试试。是的,你是对的。非常感谢您的帮助,我在构造函数和析构函数中有打印语句。只打印了一条构造函数语句,其中打印了多条析构函数语句。这意味着物体确实被移动了。输出-创建通用销毁通用销毁通用销毁通用理解我犯错误的地方。非常感谢Nikos。@RGs您的代码调用默认构造函数和隐式定义的复制构造函数。所以是的,只有一个打印出来。定义一个复制构造函数并在那里打印一些内容。