为什么添加 const 会使通用引用成为右值

Why adding `const` makes the universal reference as rvalue

我一直在阅读 Scott 关于 c++11 和 14 的最后一篇杰作中的通用引用,尽管将参数分配给左值或右值类型引用参数,但在两者之间存在一些称为通用的东西可以根据传递的参数的类型特征推断为 l/rvalue 之一的引用。我可以理解是什么使参数成为通用参考,但我不清楚的一件事是为什么将 const 添加到类型参数 const T&& p 使 p 成为右值:

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 是否会做更多的事情。

官方名称不是通用引用,但. The Standard声明只有对cv-unqualified模板参数的右值引用属于这一类:

14.8.2.1 Deducing template arguments from a function call [temp.deduct.call]

3 If P is a cv-qualified type, the top level cv-qualifiers of P’s type are ignored for type deduction. If P is a reference type, the type referred to by P is used for type deduction. A forwarding reference is an rvalue reference to a cv-unqualified template parameter. If P is a forwarding reference and the argument is an lvalue, the type “lvalue reference to A” is used in place of A for type deduction. [ Example:

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

— end example ]

允许 const T&& 充当转发引用,将无法重载仅采用右值引用作为参数的模板函数。

更新:正如@HowardHinnant 在评论中提到的那样,const T&& 确实有它的用途(另见 this Q&A)。