我很好奇,一般来说,对于从 C++11 开始的模板化函数参数,您是否要使用 T&&(通用引用)而不是经典的 T const&(左值引用)。我特别好奇的是,如果您还想处理 r-value 引用,您将如何解决您被迫丢失 const 的事实;有没有解决的办法?
3 回答
“失去常量”没有问题。T
如果参数是 cv 限定的,则将使用 cv 限定符推导。例如,如果参数是类型的右值const std::string
,则T
推导为const std::string
。您不可能通过使用转发引用来违反 const 正确性。如果可以,那将是一个主要的语言缺陷。
至于何时应使用转发引用的更广泛问题,请参见此处:正确使用通用引用
您不会被迫失去 const:
template<typename T> void fun(T &&val)
可能会绑定非 const 左值、const 左值和右值。您仍然完全可以这样做template<typename T> void fun(const T &v)
,这将是 const 引用的更专业的重载,因此不可修改的左值将达到此重载。
第一个带有“前向引用”的重载将绑定到可修改的值和右值。如果我阅读带有转发引用的模板函数的原型(S. Meyers 将其称为“通用引用”),那么这告诉我该函数可能会利用移动语义,仅此而已。
可以在内部检测参数的常量性;但是,既然您问这是否是推荐的通用方式,我会说建议在其自身的重载中管理不可修改的左值,除非不切实际(例如在处理可能或不是 const 的多个参数时)
这个问题非常边缘化,因为您要征求意见,但要回答技术问题,您不要放弃 const。这就是为什么它被称为通用参考。