根据cppreference.com,move
有签名
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;
发生了什么事?我很困惑。
答案 0 :(得分:8)
它不是左值参考,而是forwarding reference;这可以保留参数的值类别。这意味着std::move
可以同时使用左值和右值,并无条件地将它们转换为右值。
转发引用是一种特殊的引用,它保留了函数参数的值类别,从而可以通过std :: forward转发它。转发参考是:
1)声明为rvalue的函数模板的函数参数 引用cv-unqualified type template参数 功能模板:
2)auto&amp;&amp;除非从大括号括起的初始化列表中推断出来。
另一方面,int&&
是左值参考;请注意这里的区别,如果函数模板参数的类型为T&&
且模板参数为T
,即推导类型为T
,则该参数为转发引用。