7

我很好奇,一般来说,对于从 C++11 开始的模板化函数参数,您是否要使用 T&&(通用引用)而不是经典的 T const&(左值引用)。我特别好奇的是,如果您还想处理 r-value 引用,您将如何解决您被迫丢失 const 的事实;有没有解决的办法?

4

3 回答 3

8

“失去常量”没有问题。T如果参数是 cv 限定的,则将使用 cv 限定符推导。例如,如果参数是类型的右值const std::string,则T推导为const std::string。您不可能通过使用转发引用来违反 const 正确性。如果可以,那将是一个主要的语言缺陷。

至于何时应使用转发引用的更广泛问题,请参见此处:正确使用通用引用

于 2015-06-09T00:18:08.297 回答
1

您不会被迫失去 const: template<typename T> void fun(T &&val)可能会绑定非 const 左值、const 左值和右值。您仍然完全可以这样做template<typename T> void fun(const T &v),这将是 const 引用的更专业的重载,因此不可修改的左值将达到此重载。

第一个带有“前向引用”的重载将绑定到可修改的值和右值。如果我阅读带有转发引用的模板函数的原型(S. Meyers 将其称为“通用引用”),那么这告诉我该函数可能会利用移动语义,仅此而已。

可以在内部检测参数的常量性;但是,既然您问这是否是推荐的通用方式,我会说建议在其自身的重载中管理不可修改的左值,除非不切实际(例如在处理可能或不是 const 的多个参数时)

于 2015-06-09T00:19:13.993 回答
0

这个问题非常边缘化,因为您要征求意见,但要回答技术问题,您不要放弃 const。这就是为什么它被称为通用参考。

于 2015-06-09T00:18:19.403 回答