是否使用T const&或T&&

时间:2015-06-08 23:54:01

标签: c++ c++11 rvalue universal-reference

我很好奇,一般来说,你是否要使用T&& (通用参考)而不是经典的T const& (l值引用)用于以C ++ 11开头的模板化函数参数。我特别好奇的是,如果你想要处理r值引用,你如何绕过这个事实,你被迫失去const;有办法解决这个问题吗?

3 个答案:

答案 0 :(得分:8)

“失去const”没有问题。如果参数是cv-qualified,则将使用cv-qualifiers推导出T。例如,如果参数是const std::string类型的右值,则T将推导为const std::string。通过使用转发引用,您不可能违反const-correctness。如果可以,那将是一个主要的语言缺陷。

至于何时应使用转发引用这一更广泛的问题,请参见此处:Proper use of universal references

答案 1 :(得分:0)

这个问题非常微不足道,因为你要求提出意见,但要回答技术问题,你不要松开常数。这就是为什么它被称为通用参考。

答案 2 :(得分:0)

你不会被迫失去const: template<typename T> void fun(T &&val)可能绑定非常量左值,常量值和右值。你完全被允许做template<typename T> void fun(const T &v)这对于const引用来说是一个更专业的重载,因此不可修改的l值会达到这个过载。

第一次重载,使用&#39;前向引用&#39;将绑定到可修改的值和rvalues。如果我阅读带有转发参考的模板函数的原型(S. Meyers的洗礼为&#34;通用引用&#34;)那告诉我的是该函数可能会利用移动语义,仅此而已。

可以在内部检测参数的常量;但是,既然你问这是否是推荐的一般方法,我会建议在自己的重载中管理不可修改的l值,除非是不切实际的(例如处理多个参数时可能或不是const)< / p>