我从几个来源接受过教育,在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
?感谢。
答案 0 :(得分:5)
哪个特定的异常规则允许它在这里绑定到左值?
那是12.8[class.copy]/32
当满足或将满足复制操作的省略标准时,除了源对象是函数参数,并且要复制的对象由左值指定,重载决策以选择构造函数首先执行复制,就像对象是由右值指定一样。