为什么std :: move将rvalue引用作为参数?

Sha*_* Li 5 c++ move rvalue-reference c++11 forwarding-reference

根据cppreference.com,move有签名

template< class T >
typename std::remove_reference<T>::type&& move( T&& t ) noexcept;
Run Code Online (Sandbox Code Playgroud)

为什么它需要一个右值参考T&& t作为它的arugment?

当我尝试以下代码时

void foo(int&& bar) {
    cout << "baz" << endl;
}

int main(){
    int a;
    foo(a);
}
Run Code Online (Sandbox Code Playgroud)

我从编译器得到一个错误"rvalue引用不能绑定到左值"

到底是怎么回事?我很困惑.

son*_*yao 8

它不是右值引用,而是转发引用 ; 这可以保留参数的值类别.这意味着std::move可以同时使用左值和右值,并无条件地将它们转换为右值.

转发引用是一种特殊的引用,它保留了函数参数的值类别,从而可以通过std :: forward转发它.转发参考是:

1)函数模板的函数参数,声明为对同一函数模板的cv-unqualified type模板参数的rvalue引用:

2)auto &&除了从括号括起的初始化列表中推断出来之外.

另一方面,int&&是一个右值参考; 注意这里的区别,如果函数模板参数具有T&&带模板参数的类型T,即推导类型T,则该参数是转发引用.