C 11:为什么右值引用参数隐式转换为左值
作者:互联网
以下是我的问题的简单代码,
void overloaded (int&& x) {
cout << "[rvalue]";
}
template <class T>
void fn (T&& x) {
overloaded(x);
}
int main() {
fn(0);
return 0;
}
我有一个编译错误
cannot bind ‘
int
’ lvalue to ‘int&&
’06001
我在这里感到困惑,x作为右值引用传递到fn()中.但是,为什么在fn()中的重载()调用抱怨x是左值?
解决方法:
第一,fn的x参数不是r值引用it’s a “universal reference”(是this is rather confusing).
二,给对象起一个名字,除非使用std :: move(总是使其成为r值引用)或使用std :: forward,否则该名字不是r值,除非明确“固定”. (在通用引用的情况下,将其转换回其原始类型).如果要避免投诉,请使用std :: forward转发为原始类型:
template <class T>
void fn (T&& x) {
overloaded(std::forward<T>(x));
}
标签:c,c11,rvalue-reference 来源: https://codeday.me/bug/20191009/1878916.html