为什么 const 模板参数不是通用/转发参考

Jas*_*ain 4 c++ language-lawyer c++11

我正在阅读有关通用引用/转发引用的信息,此链接表示

param是一个通用参考

template<typename T>
void f(T&& param);   
Run Code Online (Sandbox Code Playgroud)

但这里param不是一个通用引用,它是一个右值引用

template<typename T>
void f(const T&& param);
Run Code Online (Sandbox Code Playgroud)

通用引用的定义如下:

如果变量或参数被声明为具有某种推导类型 T 的类型 T&&,则该变量或参数是通用引用。

我读过 T 是一个推导类型,因为Template argument deduction

为什么第二种情况不是通用参考?const T&& param出于某种原因,是否存在不遵循模板参数推论?如果是这样,为什么?

eer*_*ika 8

前言:官方术语是转发引用。

那么为什么第二种情况不是通用参考呢?

因为它是对 const 的引用。对 const 的引用不是转发引用。

为什么?

转发引用的全部意义在于,当右值作为参数给出时,该参数将被推导出为对非常量右值的引用,这允许在转发时移动此类参数(同时允许左值不从)。您不能从对 const 的引用移动,因为移动构造函数的参数将是对非常量的右值引用,不能绑定到对 const 的引用。

语言律师的回答是:因为标准是这样说的:

[temp.deduct.call] 转发引用是对cv 非限定 模板参数的右值引用,该参数不代表类模板的模板参数...


Sto*_*ica 6

因为这会违背目的。

即使它是一个转发引用,在传递右值时你也会得到 const 右值引用。移动语义需要一个非常量引用,以便可以修改源对象,因为重点是窃取 about-to 的内部状态-expire 对象,而不是做一个潜在的昂贵的副本。

无论价值类别如何,您都会一直进行复制。所以在这种情况下“转发”没有意义。