我认为我对右值引用不太理解。为什么以下无法编译(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(使用前将#替换为@)