C++ 使用声明的析构函数自动生成默认移动构造函数

C++ 使用声明的析构函数自动生成默认移动构造函数,c++,c++11,c++14,C++,C++11,C++14,C++11标准规定,不应为声明析构函数的类生成自动生成的移动构造函数,而是 代码段正确生成并运行: #include <iostream> class C { public: ~C() { std::cout << "Called C:~C" << std::endl; } private: std::string v; }; int main() { C c1; C c2 = std::move(c1); r

C++11标准规定,不应为声明析构函数的类生成自动生成的移动构造函数,而是 代码段正确生成并运行:

#include <iostream>

class C
{
public:
    ~C() { std::cout << "Called C:~C" << std::endl; }

private:
    std::string v;
};


int main()
{
    C c1;
    C c2 = std::move(c1);

    return 0;
}
#包括
C类
{
公众:

~C(){std::cout初始化使用隐式定义的copy构造函数。通常,当由于某种原因无法使用move构造函数或move赋值运算符时,move将始终退回到copy,因为copy构造函数和copy赋值运算符始终是声明的(尽管在某些情况下可以删除).

初始化使用隐式定义的复制构造函数。通常,当由于某种原因无法使用移动构造函数或移动赋值运算符时,移动将始终返回到副本,因为复制构造函数和复制赋值运算符始终是声明的(尽管在某些情况下可以删除它们)。

Brian的回答已经解释了代码编译的原因。要正确检查move-ctor是否被禁止,只需在类中放入一个不可复制的对象,例如
std::unique\u ptr

class C
{
public:
    ~C() { std::cout << "Called C:~C" << std::endl; }

private:
    std::string v;
    std::unique_ptr<char> p;
};
C类
{
公众:

~C(){std::coutBrian的回答已经解释了代码编译的原因。要正确检查move ctor是否被禁止,只需在类中放入一个不可复制的对象,例如
std::unique\u ptr

class C
{
public:
    ~C() { std::cout << "Called C:~C" << std::endl; }

private:
    std::string v;
    std::unique_ptr<char> p;
};
C类
{
公众:

~C(){std::cout在用户声明的dtor存在的情况下隐式将隐式声明的复制ctor定义为默认(而不是删除)是不推荐的。因此,不应该依赖OP中的行为。隐式将隐式声明的复制ctor定义为默认(而不是删除)当用户出现时,声明的dtor已被弃用。因此不应依赖OP中的行为。