【发布时间】:2017-12-17 05:05:18
【问题描述】:
根据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);
}
我从编译器收到一个错误“右值引用不能绑定到左值”
发生了什么事?我很困惑。
【问题讨论】:
-
您假设
T&& t是一个右值引用。这还为时过早,在您知道T是什么之前,没有办法说T&& t是否是 rvlaue 引用。在推导T时,特意设计了语言规则(类型推导和引用折叠),使T&& t根据外部情况在右值和左值引用之间切换。 -
令人困惑。根据上下文,双放大器 && 具有两种含义中的任何一种。在模板参数上,它表示“转发引用”。
标签: c++ c++11 move rvalue-reference forwarding-reference