了解右值引用

2024-03-17

我认为我对右值引用不太理解。为什么以下无法编译(VS2012)并出现错误'foo' : cannot convert parameter 1 from 'int' to 'int &&'?

void foo(int &&) {}
void bar(int &&x) { foo(x); };

我会假设类型int &&从 bar 传递到 foo 时将被保留。为什么会变成int一旦进入函数体内?

我知道答案是使用std::forward:

void bar(int &&x) { foo(std::forward<int>(x)); }

所以也许我只是没有清楚地了解why。 (另外,为什么不std::move?)


我总是记得左值是一个有名称或可以寻址的值。由于 x 有名称,因此它作为左值传递。引用右值的目的是允许函数以任何它认为合适的方式完全破坏值。如果我们像您的示例一样通过引用传递 x,那么我们无法知道这样做是否安全:

void foo(int &&) {}
void bar(int &&x) { 
    foo(x); 
    x.DoSomething();   // what could x be?
};

Doing foo(std::move(x));明确告诉编译器您已经完成了 x 并且不再需要它。如果没有这一举措,现有代码可能会发生不好的事情。这std::move是一种保障。

std::forward用于模板中的完美转发。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解右值引用 的相关文章

随机推荐