2013-11-28 56 views
3

上移动语义隐含的使用相对简单的问题,C++ 11移动构造函数和赋值操作符

当我们有

A func(); 

下面的代码:

A a; 

a = func(); 

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

如果已经为A定义了移动构造函数和移动赋值,那么将在最后一个语句中为临时/右值创建什么?它会是复制构造函数后跟移动赋值?

+0

从func()中得到的是一个右值,所以我猜测移动赋值操作符会被调用。 – Shoe

回答

2

使用移动构造函数创建临时对象,如果有,并且返回值可以被视为右值,否则为复制构造函数。如果该函数适用于返回值优化,则可能会忽略它。

分配给a是通过移动赋值运算符完成的(如果有的话),否则为复制赋值运算符。这是因为临时是右值

+0

'和返回值可以被视为右值',有没有办法如何不能这样? (在上面的例子中) – Paranaix

+0

'C++ 11 section 3.10'将'func()'的临时结果定义为'prvalue',它是一种特殊的'rvalue' – user2485710

+0

@Paranaix:Yes;如果返回值是函数返回时不会被销毁的东西(即不是临时或本地自动变量),则不能将其视为_rvalue_。 –

相关问题