为什么Rvalue参考被通用参考转换为左值参考

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吗?

Edg*_*jān 6

原因是命名的右值引用被视为左值.

在将t传递给f1以保留rvalueness 时,应该在f2内使用std :: move:

void f2(int&& t) {
    f1(std::move(t));
}
Run Code Online (Sandbox Code Playgroud)

在这里你可以找到一个很好的解释.