C++11移动构造函数和赋值运算符

3
一个关于移动语义隐式使用的相对简单的问题,
当我们有
A func();

以下是代码:
A a;

a = func();

将调用A的默认构造函数和A的复制构造函数来创建/返回临时对象,然后使用复制赋值运算符将其分配给对象a。

如果为A定义了移动构造函数和移动赋值函数,则在最后一条语句中实际上将调用哪个函数来创建临时/右值?是先调用复制构造函数,然后再调用移动赋值函数吗?


func() 的返回值是一个 rvalue,因此我猜测会调用移动赋值运算符。 - Shoe
1个回答

2

如果有移动构造函数且返回值可以被视为rvalue,则使用移动构造函数创建临时对象,否则使用复制构造函数。如果函数适合返回值优化,则可能省略此步骤。

将值赋给 a 时,如果有移动赋值运算符,则使用移动赋值运算符;否则使用复制赋值运算符,因为临时对象是一个rvalue。


“并且返回值可以被视为rvalue”,有没有任何方法可以不这样做?(在上面的例子中) - Sebastian Hoffmann
“C++11第3.10节”将func()的临时结果定义为prvalue,这是一种特定类型的rvalue - user2485710
@Paranaix:是的;如果返回值是 函数返回时不会被销毁的东西(即不是临时或局部自动变量),那么它就不能被视为_rvalue_。 - Mike Seymour
@MikeSeymour 看起来我把你的两个答案混淆了,现在对我很清楚了。 - Sebastian Hoffmann
谢谢你的答案,总的来说可以认为编译器会在可用的情况下使用移动构造函数来生成prvalues,但它是否执行典型的RVO可能也是一种情况?事实上,我只需阅读相关的标准文档,我只是想更快地获取这些信息。 - computador7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接