【发布时间】:2014-08-12 03:16:47
【问题描述】:
在 C++98 中,C++ 编译器可以自动通过成员复制生成复制构造函数和复制赋值运算符,例如
struct X {
std::string s;
std::vector<int> v;
int n;
};
编译器自动为X生成复制构造函数和复制赋值运算符,使用成员复制。
但是 C++11 中的移动语义如何改变?
是 move constructor 和 move 赋值运算符 自动生成,比如复制构造函数和复制赋值运算符?
是否存在移动操作不自动生成的情况?
【问题讨论】:
-
自动移动是一种优化,因此理想情况下不应影响除速度之外的任何可观察行为。但是例如用户定义的析构函数可能依赖于关于数据成员的各种假设。 scott meyers 曾经在 clc++ 和随后的 comp.std.c++ 中开始对此进行长时间的讨论,而当前的规则(我很不清楚)反映了该讨论。
-
如果您喜欢图形、表格结果,请参阅github.com/HowardHinnant/presentations/blob/master/accu_2014/… 的第 28 张幻灯片(有报道称,某些 pdf 阅读器显示效果不佳,如果是这种情况,请尝试另一个)。
-
@HowardHinnant:您的幻灯片看起来很棒。我将有一个更详细的外观。感谢分享。
-
@HowardHinnant:如果您想写一个链接幻灯片的答案,我很乐意支持。
-
Visual Studio 2010-2013 不会生成它们,期间。来自 MSDN 上的Support For C++11/14/17 Features:“Rvalue 引用 v3.0 添加了新规则以在特定条件下自动生成移动构造函数和移动赋值运算符。这是在 Visual Studio 2015 中实现的”。他们所说的“Rvalue references v3.0”是N3053, Defining Move Special Member Functions (MARCH 2010)。
标签: c++ c++11 move-semantics