8

根据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);
}

我从编译器得到一个错误“右值引用不能绑定到左值”

到底是怎么回事?我很混乱。

4

1 回答 1

10

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

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

1) 函数模板的函数参数声明为对同一函数模板的 cv 非限定类型模板参数的右值引用:

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

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

于 2017-12-17T05:11:53.667 回答