我正在阅读有关通用引用/转发引用和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
的存在是否不遵循模板参数推导?如果是这样,为什么?
答案 0 :(得分:7)
前言:官方术语是转发参考。
那为什么第二种情况不是通用参考?
因为它是对const的引用。而且对const的引用不是转发引用。
为什么?
转发引用的全部要点是,当将rvalue用作参数时,将推导该参数作为对非const rvalue的引用,这允许在转发时移出该参数(同时允许不使用lvalue)。移出)。您不能从引用移动到const,因为move构造函数的参数将是对非const的右值引用,该非const无法绑定到对const的引用。
语言律师的答案是:因为标准是这样说的:
[temp.deduct.call]转发引用是对 cv不合格模板参数的右值引用,该参数不表示类模板的模板参数...
答案 1 :(得分:6)
因为它会失败。
即使它是一个转发引用,传递rvalues时也将获得const rvalue引用。移动语义需要一个非const引用,以便可以修改源对象,因为该点窃取了内部状态。即将到期的对象,而不是进行潜在的昂贵复制。
无论值类别如何,您都将一直在进行复制。因此,在这种情况下,“转发”是没有意义的。