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

时间:2017-12-17 05:05:18

标签: c++ c++11 move rvalue-reference forwarding-reference

根据cppreference.commove有签名

template< class T >
typename std::remove_reference<T>::type&& move( T&& t ) noexcept;

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

此外,当我尝试以下代码时

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

int main(){
    int a;
    foo(a);
}

我从编译器得到错误&#34;右值参考不能绑定到左值&#34;

发生了什么事?我很困惑。

1 个答案:

答案 0 :(得分:8)

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

  

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

     

1)声明为rvalue的函数模板的函数参数   引用cv-unqualified type template参数   功能模板:

     

2)auto&amp;&amp;除非从大括号括起的初始化列表中推断出来。

另一方面,int&&是左值参考;请注意这里的区别,如果函数模板参数的类型为T&&且模板参数为T,即推导类型为T,则该参数为转发引用。