请考虑以下带有转发参考参数的模板功能接口:
template<typename T>
void f(T&& t) { ... }
在这种情况下,f
要么采用左值引用,要么使用右值引用,具体取决于f
的参数类型。如何表达f
不修改其参数?以下天真的方法不起作用,因为它不再允许将左值引用传递给f
:
template<typename T>
void f(const T&& t) { ... }
答案 0 :(得分:34)
如何表达f不修改其参数?
如果函数没有修改其参数,那么使用转发引用没有任何好处。当你想要转发参数时,你可以使用转发引用来关注其他函数,该函数关心的是参数是左值还是右值(因为左值和右值可能有单独的重载,以及rvalue一个可以更有效率)。
如果你的函数没有修改参数,那么它不应该关心它是否有左值或左值,所以它可以无条件地取const T&
。这可以绑定到左值和右值,并承诺不修改参数。
template<typename T>
void f(const T& t) { ... }