考虑以下类:
class A
{
public:
std::string field_a;
std::string field_b;
}
现在考虑以下复制结构:
A a1(a2);
A
尽管缺少显式复制构造函数,复制构造仍将充分复制,因为std::string
编译器生成的隐式复制构造函数将调用 for 的复制构造函数。
我想知道的是,搬家施工也是如此吗?
编辑:这里的测试表明:
A a2(std::move(a1));
实际上会导致复制构造,除非特定的移动构造函数:
A( A && other ) : a(std::move(other.a)) {}
被定义为。
编辑 编辑 我联系了 Stephan T Lavavej 并问他为什么 VC 2012 似乎没有遵循 12.8 草案关于隐式移动构造函数生成的规定。他好心解释:
它更像是一个“尚未实现的功能”而不是一个错误。VC 目前实现了我所说的右值引用 v2.0,其中移动 ctors/assigns 永远不会隐式生成,也不会影响复制 ctors/assigns 的隐式生成。C++11 指定右值引用 v3.0,这是您正在查看的规则。