其他分享
首页 > 其他分享> > 为什么C默认不移动构造右值引用?

为什么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