return语句绑定左值对左值的引用?

goo*_*era 1 c++ language-lawyer c++11

我从几个来源接受过教育,在C++ 11中,函数的返回值可以从包含命名局部变量的return语句构造.例如:

class A {};

A f() {
    A a;
    return a;
}

int main() {
    f();
}
Run Code Online (Sandbox Code Playgroud)

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

我的问题是,A'move构造函数的参数是类型的A&&,它只能绑定到prvalue或xvalue,对吧?那么哪个特定的异常规则允许它绑定到左值a?谢谢.

Cub*_*bbi 5

哪个特定的异常规则允许它绑定到左值这里?

那是 12.8[class.copy]/32

当满足或将满足复制操作的省略标准时,除了源对象是函数参数这一事实,并且要复制的对象由左值指定,重载决策选择复制的构造函数是首先执行,好像对象是由右值指定的.