Почему добавление `const` делает универсальную ссылку как rvalue

Я читал об универсальных ссылках в последнем компиляторе Скотта о С++ 11 и 14 с тем, что, несмотря на аргумент, присвоенный либо ссылочному параметру lvalue, либо ссылочному типу rvalue, есть что-то среднее между универсальной ссылкой, которая может быть вычислено либо l/rvalue, основанному на типе признаков переданного аргумента. Я мог понять, что делает параметр универсальной ссылкой, но одна вещь, которая мне не понятна, заключается в том, что добавление const к параметру типа const T&& p делает p как rvalue:

template<typename T>
void f(T&& param); // param is an universal reference

template<typename T>
void f(const T&& param); // param is an rvalue reference

Делает ли const больше, чем это, когда назначается эталонный параметр.

Ответы

Ответ 1

Официальное название не является универсальной ссылкой, но ссылка для пересылки. Стандарт утверждает, что только ссылки rvalue на параметры шаблона cv-unqualified попадают в этот категория:

14.8.2.1 Вывод аргументов шаблона из вызова функции [temp.deduct.call]

3 Если P является классом с квалификацией cv, верхние уровни cv-квалификаторы типа Ps игнорируются для вывода типа. Если P является ссылочным типом, тип называемый P, используется для вычитания типа. Ссылка на пересылку ссылку rvalue на параметр cv-unqualified template. Если P является пересылка ссылки и аргумент является lvalue, тип "lvalue ссылка на A" используется вместо A для вывода типа. [Пример:

template <class T> int f(T&& heisenreference);
template <class T> int g(const T&&);
int i;
int n1 = f(i); // calls f<int&>(int&)
int n2 = f(0); // calls f<int>(int&&)
int n3 = g(i); // error: would call g<int>(const int&&), which
               // would bind an rvalue reference to an lvalue

- конец примера]

Разрешить const T&& вести себя как перенаправление ссылок, сделает невозможным перегрузку функции шаблона, которая принимает в качестве параметра только ссылку rvalue.

Обновить: как упоминает @HowardHinnant в комментариях, const T&& действительно использует его (см. также этот Q & A).