Почему добавление ссылки на ссылку rvalue не является ошибкой?

У меня есть следующий typedef:

using int_ref = int&&;

Почему следующий код не вызывает ошибку (или распечатывает false)?

std::cout << is_same< int_ref, int_ref&& >::value; // prints 1

Я ожидал бы, что int_ref&& будет расширен до int&& &&, что, очевидно, невозможно. Я что-то пропустил?

Ответы

Ответ 1

Это происходит из-за правил свертывания ссылок.

В принципе, хотя вы не можете написать ссылку на ссылку самостоятельно, в некоторых случаях (typedefs, параметры шаблона, decltypes) вы можете добавить создать ссылку на ссылочный тип, который сворачивается следующим образом:

A& & -> A&
A& && -> A&
A&& & -> A&
A&& && -> A&&

В вашем случае int_ref есть int&&, поэтому int&& && становится int&&.


Соответствующая стандартная цитата:

(N3337) [dcl.ref]/6: Если typedef (7.1.3), шаблон-параметр типа (14.3.1) или спецификатор decltype (7.1.6.2) обозначает тип TRэто ссылка на тип T, попытка создания типа "ссылка lvalue на cv TR" создает тип "lvalue reference to T", в то время как попытка создать тип "rvalue reference to cv TR" создает тип TR.