【发布时间】:2012-10-31 22:34:48
【问题描述】:
考虑以下类:
class A
{
public:
std::string field_a;
std::string field_b;
}
现在考虑以下复制结构:
A a1(a2);
尽管缺少显式复制构造函数,复制构造仍将充分复制 A,因为 std::string 的复制构造函数将由编译器生成的隐式复制构造函数调用。
我想知道的是,移动构造是否也是如此?
编辑:测试here 表明:
A a2(std::move(a1));
实际上会导致复制构造,除非特定的移动构造函数:
A( A && other ) : a(std::move(other.a)) {}
已定义。
编辑编辑 我联系了 Stephan T Lavavej,问他为什么 VC 2012 似乎没有遵循 12.8 草案中关于隐式移动构造函数生成的规定。他好心解释:
与其说是错误,不如说是“尚未实现的功能”。目前风投 实现了我所说的右值引用 v2.0,其中 move ctors/assigns 永远不会隐式生成,也不会影响 复制ctors/assigns的隐式生成。 C++11 指定右值 参考 v3.0,这是您正在查看的规则。
【问题讨论】:
标签: c++ visual-c++ c++11 visual-studio-2012 move-semantics