其他分享
首页 > 其他分享> > C 11:为什么右值引用参数隐式转换为左值

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