在他的书Effective Modern C++中,第节第1项:理解模板类型演绎,Scott Meyers在讨论案例1时说过:ParamType是引用或指针,但不是通用引用
这些例子都显示了左值引用参数,但是类型推导对右值引用参数的工作方式完全相同。当然,只有右值实参可以传递给右值引用形参,但是这个限制与类型演绎无关。
在引用段落之前的部分中给出的左值引用示例如下。
如果这是我们的模板
template<typename T>
void f(T& param); // param is a reference
我们有这些变量声明
int x = 27; // x is an int
const int cx = x; // cx is a const int
const int& rx = x; // rx is a reference to x as a const int
各种调用中param和T的推导类型如下:
f(x); // T is int, param's type is int&
f(cx); // T is const int, param's type is const int&
f(rx); // T is const int, param's type is const int&
**问题:**对我来说,上面引用的段落有点令人困惑,原因如下。
如果我试着自己练习,案例1处理右值引用的例子,它应该是什么样子?可能会像下面这样?
template<typename T>
void f(T&& param); // param is an rvalue reference
但这不是和第二种情况一样吗:ParamType是一个通用引用吗?
一个右值引用如何在案例1中显示,而不会自动成为一个通用/转发引用,因为这是在类型推导的上下文中?
理解这一点的一种方式可以是将其Map到情况2子情况2,其中初始化表达式是右值。在这种情况下,它被指定为与情况1一样工作。所以这可能是从案例2到案例1的循环。
1条答案
按热度按时间neskvpey1#
是的,这是真的,你不能隔离直接使用模板函数的右值参数的情况,因为它毕竟成为通用引用。但是如果你只想在第二种情况下使用右值引用,即使用通用引用的方法,你可以通过使用模板函数std::enable_if沿着std::is_lvalue_reference来限制绑定到左值,正如漂亮的解释here