参考演绎如何运作?
How reference deduce works?
可以复制到。
我读了Effective Modern C++. Under Item 1
, I found a case for universal reference:
最后一个例子f(27);
我在VS2013下做了测试
void process(int& x)
{
std::cout << "int&" << std::endl;
}
void process(int&& x)
{
std::cout << "int&&" << std::endl;
}
template<typename T>
void f(T&& param)
{
std::cout << "------------------------------------------------" << std::endl;
if (std::is_lvalue_reference<T>::value)
{
std::cout << "T is lvalue reference" << std::endl;
}
else if (std::is_rvalue_reference<T>::value)
{
std::cout << "T is rvalue reference" << std::endl;
}
else
{
std::cout << "T is NOT lvalue reference" << std::endl;
}
std::cout << "param is: " << typeid(param).name() << std::endl;
process(std::forward<T>(param));
process(param);
}
int getINT()
{
int x = 10;
return x;
}
int _tmain(int argc, _TCHAR* argv[])
{
f(10);
f(getINT());
return 0;
}
这是输出:
------------------------------------------------
T is NOT lvalue reference
param is: int
int&&
int&
------------------------------------------------
T is NOT lvalue reference
param is: int
int&&
int&
我发现在模板函数中,没有std::forward<T>(param)
,process(int& x)
会被调用,但是根据书本,param
的类型应该是右值引用,所以process(int&& x)
应该被调用。但这种情况并非如此。 是不是我理解错了什么?
这是我从其他 thread 找到的转发参考:
您将类型与 value categories 混淆了。作为命名参数,param
是一个左值,那么对于 process(param);
process(int& x)
将被调用。
这就是我们应该使用 std::forward
with forwarding reference 的原因;对于这种情况,std::forward<T>(param)
将 param
转换为右值,然后 process(int&& x)
将被调用(如预期的那样)。
可以复制到
我读了Effective Modern C++. Under Item 1
, I found a case for universal reference:
最后一个例子f(27);
我在VS2013下做了测试
void process(int& x)
{
std::cout << "int&" << std::endl;
}
void process(int&& x)
{
std::cout << "int&&" << std::endl;
}
template<typename T>
void f(T&& param)
{
std::cout << "------------------------------------------------" << std::endl;
if (std::is_lvalue_reference<T>::value)
{
std::cout << "T is lvalue reference" << std::endl;
}
else if (std::is_rvalue_reference<T>::value)
{
std::cout << "T is rvalue reference" << std::endl;
}
else
{
std::cout << "T is NOT lvalue reference" << std::endl;
}
std::cout << "param is: " << typeid(param).name() << std::endl;
process(std::forward<T>(param));
process(param);
}
int getINT()
{
int x = 10;
return x;
}
int _tmain(int argc, _TCHAR* argv[])
{
f(10);
f(getINT());
return 0;
}
这是输出:
------------------------------------------------
T is NOT lvalue reference
param is: int
int&&
int&
------------------------------------------------
T is NOT lvalue reference
param is: int
int&&
int&
我发现在模板函数中,没有std::forward<T>(param)
,process(int& x)
会被调用,但是根据书本,param
的类型应该是右值引用,所以process(int&& x)
应该被调用。但这种情况并非如此。 是不是我理解错了什么?
这是我从其他 thread 找到的转发参考:
您将类型与 value categories 混淆了。作为命名参数,param
是一个左值,那么对于 process(param);
process(int& x)
将被调用。
这就是我们应该使用 std::forward
with forwarding reference 的原因;对于这种情况,std::forward<T>(param)
将 param
转换为右值,然后 process(int&& x)
将被调用(如预期的那样)。