为什么C ++默认不移动构造右值引用?

时间:2017-08-23 15:33:45

标签: c++ rvalue-reference move-constructor lvalue-to-rvalue stdmove

说我有以下功能

void doWork(Widget && param)  // param is an LVALUE of RRef type
{
    Widget store = std::move(param); 
}

为什么我需要将param强制转换为std::move()的右值? param的类型是不是很明显,因为它在函数签名中被声明为右值引用?不应该仅仅根据这个原则自动调用移动构造函数吗?

为什么默认情况下不会发生这种情况?

1 个答案:

答案 0 :(得分:23)

与您的设计:

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
}

所以这里的道德是,即使你有一个右值参考,你有一个名称,这意味着你可以多次使用它。因此,您无法自动移动它,因为您可能需要它以供以后使用。