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

时间:2017-12-14 17:10:15

标签: c++ c++11

在Effective Modern C ++中,它说

  

仅为缺少明确的类生成移动操作   声明了移动操作,复制操作和析构函数。

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

Example program

#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);
}

编辑:复制&#34;移动操作&#34;从书中可能会导致混乱。将其更改为移动构造函数并移动赋值。

1 个答案:

答案 0 :(得分:7)

int now = DateTime.NowUTC.TimeOfDay.Hours;只是std::move的演员。它创建的完全相同的xvalue将愉快地绑定到A&&,这是隐式默认的复制c'tor和复制赋值运算符所接受的。这就是你所说的。

您向const A&“显示”的事实并不意味着定义了任何这些移动操作。

如果您在班级中添加std:move,则会开始以红色加下划线。因为现在copy c'tor接受一个非const值左右引用,它不会绑定到A(A&) = default;