为什么这个右值引用绑定到一个左值?
Why does this rvalue reference bind to an lvalue?
我不明白为什么以下代码可以在 GCC 8.0 上编译:
decltype(auto) foo(int&& r) {
return r;
}
在foo
中,r
的声明类型是int&&
,所以foo
的return类型也是int&&
.但是 r
本身是一个左值,左值不能绑定到右值引用。
我是不是漏掉了什么?
根据[dcl.spec.auto]/5, the return type is deduced as if the return
statement's operand was the operand of decltype
. And [dcl.type.simple]/(4.2) clearly states that, as the operand is not parenthesized, the type of the entity is the type yielded by decltype
, that is, int&&
. And indeed, r
is an lvalue ([expr.prim.id.unqual])。
幸运的是,这已在两年前被发现并归档为 bug 64892。 (我想知道为什么没人能抽出时间来解决这个问题?)
我不明白为什么以下代码可以在 GCC 8.0 上编译:
decltype(auto) foo(int&& r) {
return r;
}
在foo
中,r
的声明类型是int&&
,所以foo
的return类型也是int&&
.但是 r
本身是一个左值,左值不能绑定到右值引用。
我是不是漏掉了什么?
根据[dcl.spec.auto]/5, the return type is deduced as if the return
statement's operand was the operand of decltype
. And [dcl.type.simple]/(4.2) clearly states that, as the operand is not parenthesized, the type of the entity is the type yielded by decltype
, that is, int&&
. And indeed, r
is an lvalue ([expr.prim.id.unqual])。
幸运的是,这已在两年前被发现并归档为 bug 64892。 (我想知道为什么没人能抽出时间来解决这个问题?)