我不明白为什么以下代码在GCC 8.0上编译:
decltype(auto) foo(int&& r) {
return r;
}
在foo
中,r
的声明类型为int&&
,因此foo
的返回类型也为int&&
。但是r
本身是一个左值,左值不能绑定到右值参考。
我错过了什么吗?
答案 0 :(得分:15)
根据[dcl.spec.auto]/5,推断出返回类型,就好像return
语句的操作数是decltype
的操作数一样。 [dcl.type.simple]/(4.2)明确指出,由于操作数没有括号,实体的类型是decltype
产生的类型,即int&&
。事实上,r
是一个左值([expr.prim.id.unqual])。
幸运的是,两年前已经发现并提交了bug 64892。 (我想知道为什么没有人能找到时间解决这个问题?)