Jav*_*Man 4 c++ rvalue-reference lvalue-to-rvalue perfect-forwarding c++11
我想当一个通用引用参数与一个右值引用参数匹配时,会返回一个右值引用参数.但是,我的测试显示rvalue引用被通用引用函数模板转换为左值引用.为什么会这样?
#include <iostream>
#include <type_traits>
using namespace std;
template <typename T>
T f1(T&&t) { //<-----this is a universal reference
cout << "is_lvalue reference:" << is_lvalue_reference<T>::value << endl;
cout << "is_rvalue reference:" << is_rvalue_reference<T>::value << endl;
cout << "is_reference:" << is_reference<T>::value << endl;
return t;
}
void f2(int&& t) {
cout << "f2 is_lvalue reference:" << is_lvalue_reference<decltype(t)>::value << endl;
cout << "f2 is_rvalue reference:" << is_rvalue_reference<decltype(t)>::value << endl;
cout << "f2 is_reference:" << is_reference<decltype(t)>::value << endl;
f1(t);
}
int main()
{
f2(5);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在GCC和VC++ 2010中,结果如下:
f2 is_lvalue reference:0
f2 is_rvalue reference:1
f2 is_reference:1
is_lvalue reference:1
is_rvalue reference:0
is_reference:1
Run Code Online (Sandbox Code Playgroud)
换句话说,参数tin f2是一个右值引用,但是当传递给它时f1,参数变为左值引用.它不应该保留rvalue-ness f1吗?
原因是命名的右值引用被视为左值.
在将t传递给f1以保留rvalueness 时,应该在f2内使用std :: move:
void f2(int&& t) {
f1(std::move(t));
}
Run Code Online (Sandbox Code Playgroud)
在这里你可以找到一个很好的解释.