为什么这个右值引用绑定到左值?

时间:2017-08-06 12:26:15

标签: c++ c++14 language-lawyer rvalue-reference decltype

我不明白为什么以下代码在GCC 8.0上编译:

decltype(auto) foo(int&& r) {
    return r;
}

foo中,r的声明类型为int&&,因此foo的返回类型也为int&&。但是r本身是一个左值,左值不能绑定到右值参考。

我错过了什么吗?

1 个答案:

答案 0 :(得分:15)

根据[dcl.spec.auto]/5,推断出返回类型,就好像return语句的操作数是decltype的操作数一样。 [dcl.type.simple]/(4.2)明确指出,由于操作数没有括号,实体的类型是decltype产生的类型,即int&&。事实上,r是一个左值([expr.prim.id.unqual])。

幸运的是,两年前已经发现并提交了bug 64892。 (我想知道为什么没有人能找到时间解决这个问题?)