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

时间:2020-08-24 23:15:02

标签: c++ c++11 language-lawyer

我正在阅读有关通用引用/转发引用和this link says的信息:

param是通用参考

template<typename T>
void f(T&& param);   

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

template<typename T>
void f(const T&& param);

通用引用的定义为:

如果声明某个变量或参数的类型为T &&对于某些推导的类型T,则该变量或参数为通用引用。

而且我已经读到T是Template argument deduction的推论类型。

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

2 个答案:

答案 0 :(得分:7)

前言:官方术语是转发参考。

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

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

为什么?

转发引用的全部要点是,当将rvalue用作参数时,将推导该参数作为对非const rvalue的引用,这允许在转发时移出该参数(同时允许不使用lvalue)。移出)。您不能从引用移动到const,因为move构造函数的参数将是对非const的右值引用,该非const无法绑定到对const的引用。

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

[temp.deduct.call]转发引用是对 cv不合格模板参数的右值引用,该参数不表示类模板的模板参数...

答案 1 :(得分:6)

因为它会失败。

即使它是一个转发引用,传递rvalues时也将获得const rvalue引用。移动语义需要一个非const引用,以便可以修改源对象,因为该点窃取了内部状态。即将到期的对象,而不是进行潜在的昂贵复制。

无论值类别如何,您都将一直在进行复制。因此,在这种情况下,“转发”是没有意义的。