lau*_*svr 12 c++ constructor move-semantics c++11
有一段时间,这让我感到困惑.到目前为止,我还没有找到满意的答案.问题很简单.什么时候move assignment operator
被调用,什么时候move constructor operator
被调用?
cppreference.com上的代码示例产生以下有趣结果:
a2 = std::move(a1); // move-assignment from xvalue
Run Code Online (Sandbox Code Playgroud)
A a2 = std::move(a1); // move-construct from xvalue
Run Code Online (Sandbox Code Playgroud)
它是如何实现的?如果是这样的话,如果两者都实施了吗?如果它完全相同,为什么有可能创建一个移动赋值运算符重载.
vso*_*tco 13
只有在构造对象时才会执行移动构造函数.移动赋值运算符在先前构造的对象上执行.它与复制案例完全相同.
Foo foo = std::move(bar); // construction, invokes move constructor
foo = std::move(other); // assignment, invokes move assignment operator
Run Code Online (Sandbox Code Playgroud)
如果您没有明确声明它们,编译器会为您生成它们(除了一些例外,其列表太长,无法在此处发布).
见这对于一个完整的答案时隐式生成的举动成员函数.
何时调用移动赋值运算符
当您为对象分配右值时,就像您在第一个示例中所做的那样。
何时调用移动构造函数运算符?
当您使用rvalue初始化对象时,就像您在第二个示例中所做的那样。虽然它不是运营商。
那么它与实施哪个有关?
不,这决定了它是否可以使用,而不是何时可以使用。例如,如果没有移动构造函数,则构造函数将使用复制构造函数(如果存在),否则将失败(有错误)。
如果是这样,如果两者都实现,则执行哪个?
赋值运算符用于赋值,构造函数用于初始化。
以及为什么有可能创建移动赋值运算符重载,如果它无论如何都是相同的。
它并不相同。它是在一个已经存在的对象上调用的;构造函数被调用来初始化一个以前不存在的对象。他们经常不得不做不同的事情。例如,赋值可能必须删除一些在初始化期间不存在的东西。