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

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。 (我想知道为什么没人能抽出时间来解决这个问题?)