为什么C默认不移动构造右值引用?
作者:互联网
参见英文答案 > Rvalue Reference is Treated as an Lvalue? 4个
> Lvalue reference constructor is called instead of rvalue reference constructor 1个
说我有以下功能
void doWork(Widget && param) // param is an LVALUE of RRef type
{
Widget store = std::move(param);
}
为什么我需要使用std :: move()将参数转换回rvalue?难道很明显param的类型是rvalue,因为它在函数签名中被声明为rvalue引用?不应该仅仅根据这个原则自动调用移动构造函数吗?
为什么不默认发生这种情况?
解决方法:
与您的设计:
void doWork(Widget && param)
{
Widget store1 = param; // automatically move param
Widget store2 = param; // boom
Widget store_last = param; // boom
}
目前的设计:
void doWork(Widget && param)
{
Widget store1 = param; // ok, copy
Widget store2 = param; // ok, copy
Widget store_last = std::move(param); // ok, param is moved at its last use
}
所以这里的道德是,即使你有一个右值参考,你有一个名称,这意味着你可以多次使用它.因此,您无法自动移动它,因为您可能需要它以供以后使用.
标签:move-constructor,stdmove,c,rvalue-reference,lvalue-to-rvalue 来源: https://codeday.me/bug/20191001/1840474.html