Подтвердить что ты не робот

Почему эта ссылка rvalue привязана к lvalue?

Я не понимаю, почему следующий код компилируется в GCC 8.0:

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

В foo тип объявления r равен int&&, поэтому возвращаемый тип foo также int&&. Но r сам является lvalue, а lvalue не может связываться с ссылкой rvalue.

Я что-то пропустил?

4b9b3361

Ответ 1

В соответствии с [dcl.spec.auto]/5 тип возврата выводится так, как если операндом оператора return был операнд of decltype. И [dcl.type.simple]/(4.2) четко заявляет, что, поскольку операнд не заключен в скобки, тип объекта является типом (t21), т.е. int&&. И действительно, r является lvalue ([expr.prim.id.unqual]).

К счастью, это было обнаружено и зарегистрировано как ошибка 64892 два года назад. (Интересно, почему никто не мог найти время, чтобы исправить это?)