return 语句将右值引用绑定到左值

return statement binding rvalue reference to an lvalue?

本文关键字:绑定 引用 return 语句      更新时间:2023-10-16

我从多个来源了解到,在 C++11 中,函数的返回值可以从由命名局部变量组成的 return 语句中移动构造。 例如:

class A {};
A f() {
    A a;
    return a;
}
int main() {
    f();
}

也就是说,在 C++11 中,函数调用表达式 f() 临时指定的 prvalue 是从函数的局部变量 a 移动构造的,而不是像 C++03 中那样复制构造。 当然,这都是语义上讲的,在采取任何级别的优化之前,复制省略、NRVO 等。

我的问题是,A 的移动构造函数的参数是 A&& 型的,它只能绑定到 prvalue 或 xvalue,对吧? 那么,哪个特定的例外规则允许它绑定到这里的左值a呢? 谢谢。

哪个特定的例外规则允许它绑定到这里的左值 A?

这就是12.8[class.copy]/32

当满足或将满足复制操作省略的条件(源对象是函数参数,并且要复制的对象由左值指定)时,首先执行重载解析以选择复制的构造函数,就像对象由右值指定一样。