【发布时间】:2017-12-14 17:10:14
【问题描述】:
在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);
}
编辑:从书中复制了“移动操作”,这可能会导致混淆。将其更改为移动构造函数和移动赋值。
【问题讨论】:
-
让我们从基础开始。什么是移动操作?
-
编译器会在语言规定的时候生成它们,除非它是错误的。
-
std::move不移动,就像std::forward不转发,std::remove不删除和delete不删除它的操作数:) -
@ChristianHackl - 也被称为“有史以来最好的名字”
-
@StoryTeller:是的,好吧,只是
std::prepare_for_move、std::prepare_for_forward、std::shuffle_around_in_order_to_remove和delete_object_pointed_to_by会更糟:)