是使用T const&还是T&&

Whether to use T const& or T&&

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

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

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

这个问题很边缘,因为你是在征求意见,但要回答技术问题,你不会松开常量。这就是为什么它被称为通用参考。

你不是被迫失去常量: template<typename T> void fun(T &&val) 可能绑定非常量左值、常量左值和右值。您仍然可以完全允许执行 template<typename T> void fun(const T &v) 这将是 const 引用的更专门的重载,因此不可修改的左值将遇到此重载。

第一个重载 'forward reference' 将绑定到可修改的值和右值。如果我阅读带有转发引用的模板函数的原型(S. Meyers 将其命名为 "universal reference"),这告诉我该函数可能会利用移动语义,仅此而已。

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