为什么STD :: MOVE将RVALUE参考作为参数

Why does std::move take rvalue reference as argument?

本文关键字:参考 参数 STD MOVE 为什么 RVALUE      更新时间:2023-10-16

根据cppreference.com, move具有签名

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

为什么它将rvalue参考 T&& t作为灌溉?

也尝试以下代码

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

我从编译器中遇到了一个错误" rvalue参考不能绑定到lvalue"

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

它不是rvalue参考,而是转发参考;可以保留论点的价值类别。这意味着std::move可以同时使用LVALUE和RVALUE,并无条件地将其转换为RVALUE。

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

1)函数模板的功能参数,称为rvalue 引用该相同的CV UNCALIFIFIED类型模板参数 功能模板:

2)自动&amp;&amp;除了从支撑初始化列表中推导出来。

另一方面,int&&是RVALUE参考;请注意此处的区别,如果函数模板参数具有带有模板参数T的类型T&&,即推论类型T,则参数是转发参考。