是使用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 的多个参数时)
我很好奇,一般来说,您是否要对从 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 的多个参数时)