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