编译器什么时候不生成移动构造函数并移动赋值?

Con*_* Ma 1 c++ c++11

在Effective Modern C++中,它说

仅为缺少显式声明的移动操作,复制操作和析构函数的类生成移动操作.

但是我用Gcc和Clang测试了它,没有错误被抛出.那条规则已经过时了吗?

示例程序:

#include <iostream>
#include <string>
#include <vector>
#include <memory>

class A
{
    int i;
    public:
    ~A() = default;
};

int main()
{
    A a, b;
    a = b;
    A c(a);
    A d(std::move(a));
    b = std::move(d);
}
Run Code Online (Sandbox Code Playgroud)

编辑:从书中复制"移动操作",这可能会导致混淆.将其更改为移动构造函数并移动赋值.

Sto*_*ica 7

std::move只是一个演员A&&.它创建的非常相同的xvalue将愉快地绑定到a const A&,这是隐式默认的复制c'tor和复制赋值运算符接受的.这就是你所说的.

您"出现"的事实std:move并不意味着定义了任何这些移动操作.

如果你A(A&) = default;在课堂上添加一个,那么事情将开始用红色加下划线.因为现在copy c'tor接受一个非const左值引用,它不会绑定到a A&&.