【问题标题】:Binding modifiable rvalue reference to modifiable lvalue将可修改的右值引用绑定到可修改的左值
【发布时间】:2011-11-04 21:03:25
【问题描述】:

我有 3 个问题:

  1. 我可以将左值直接绑定到右值引用吗?

  2. std::move() 的对象会发生什么?

  3. std::move 和std::forward 有什么区别?

struct myStr{
    int m_i;
};

void foo(myStr&& rs) { }

myStr rValueGene()
{
    return myStr();
}

int main() 
{
    myStr mS= {1};
    foo(rValueGene()); //ok passing in modifiable rvalue to rvalue reference

    // To Question 1:
    //below initilize rvalue reference with modifiable lvalue, should be ok
    //but VS2010 gives a compile error: error C2440: 'initializing' : cannot convert from    'myStr' to 'myStr &&' 
    //Is this correct ?
    myStr&& rvalueRef = mS;

    //by using std::move it seems ok, is this the standard way of doing this 
    //to pass a lvalue to rvalue reference
    //myStr&& rvalueRef = std::move(mS);

    // To Question 2:    
    //also what happens to mS object after std::move ?
    //destroyed , undefined ?
}

【问题讨论】:

    标签: c++ reference move-semantics forward rvalue


    【解决方案1】:

    1>我可以将左值直接绑定到右值引用吗?

    没有明确的演员表(即:std::move)。

    2>作为 std::move() 的对象会发生什么?

    在实际移动之前什么都没有。所有std::move 所做的只是返回一个对你给它的r 值引用。实际移动发生在相关类型的移动构造函数/赋值中。

    3>std::move 和 std::forward 有什么区别?

    std::move 用于移动; std::forward 用于转发。这听起来很油嘴滑舌,但这就是想法。如果您打算移动对象,则使用std::move。如果您打算转发对象,请使用std::forward

    转发使用允许在引用类型之间进行转换的特殊语义,以便在调用之间保留引用性质。所有这些的细节都非常...技术性的。

    std::move 总是 返回一个 &&。如果你给它一个左值引用,它会返回一个右值引用。如果你给它一个值类型,它会返回一个对该值的 r 值引用。以此类推。

    std::forward总是返回 &&。从语法上讲,std::forward 只是在做一个static_cast<T&&>。但是,由于围绕转换为 && 类型的特殊语法,此转换并不总是返回 &&。是的,这很奇怪,但它解决了转发问题,所以没人关心。这就是为什么它包含在 std::forward 中,而不是必须自己明确地执行 static_cast

    【讨论】:

      【解决方案2】:

      问题1.是的,编译器是正确的。

      问题 2。没有任何反应。 std::move 只是将事物转换为右值。

      如果您使用std::movemS(或myStr)传递给foo,那么该函数可能会假设它可以“窃取”对象,因此mS 可能会在函数调用后的未指定状态。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-06
        • 2014-10-31
        • 1970-01-01
        • 2017-04-13
        • 2014-01-02
        相关资源
        最近更新 更多