一个关于移动语义隐式使用的相对简单的问题,
当我们有
以下是代码:
当我们有
A func();
以下是代码:
A a;
a = func();
将调用A的默认构造函数和A的复制构造函数来创建/返回临时对象,然后使用复制赋值运算符将其分配给对象a。
如果为A定义了移动构造函数和移动赋值函数,则在最后一条语句中实际上将调用哪个函数来创建临时/右值?是先调用复制构造函数,然后再调用移动赋值函数吗?
如果有移动构造函数且返回值可以被视为rvalue,则使用移动构造函数创建临时对象,否则使用复制构造函数。如果函数适合返回值优化,则可能省略此步骤。
将值赋给 a
时,如果有移动赋值运算符,则使用移动赋值运算符;否则使用复制赋值运算符,因为临时对象是一个rvalue。
func()
的临时结果定义为prvalue
,这是一种特定类型的rvalue
。 - user2485710
func()
的返回值是一个 rvalue,因此我猜测会调用移动赋值运算符。 - Shoe