C++ 将可修改的右值引用绑定到可修改的左值

C++ 将可修改的右值引用绑定到可修改的左值,c++,reference,move-semantics,forward,rvalue,C++,Reference,Move Semantics,Forward,Rvalue,我有3个问题: 我可以将左值直接绑定到右值引用吗 正在执行std::move()的对象会发生什么情况 std::move和std::forward之间有什么区别 问题1。是的,编译器是正确的 问题2。什么也没发生标准::移动只是将内容强制转换为右值 但是,如果要使用std::move将mS(或myStr)传递到foo,则该函数可能会假设它可以“窃取”对象,因此mS可能在函数调用后处于未指定状态 问题1。是的,编译器是正确的 问题2。什么也没发生标准::移动只是将内容强制转换为右值 但是,如果要使

我有3个问题:

  • 我可以将左值直接绑定到右值引用吗

  • 正在执行
    std::move()
    的对象会发生什么情况

  • std::move和
    std::forward
    之间有什么区别


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

    问题2。什么也没发生<代码>标准::移动只是将内容强制转换为右值


    但是,如果要使用
    std::move
    mS
    (或
    myStr
    )传递到
    foo
    ,则该函数可能会假设它可以“窃取”对象,因此
    mS
    可能在函数调用后处于未指定状态

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

    问题2。什么也没发生<代码>标准::移动只是将内容强制转换为右值

    但是,如果要使用
    std::move
    mS
    (或
    myStr
    )传递到
    foo
    ,则该函数可能会假设它可以“窃取”对象,因此
    mS
    可能在函数调用后处于未指定状态

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

    没有显式强制转换(即:
    std::move

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

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

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

    std::move
    用于移动<代码>标准::转发用于转发。这听起来很油腔滑调,但正是这个想法。如果要移动对象,请使用
    std::move
    。如果要转发对象,请使用
    std::forward

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

    std::move
    始终返回一个&&。如果给它一个l值引用,它将返回一个r值引用。如果给它一个值类型,它将返回对该值的r值引用。等等

    std::forward
    并不总是返回&&。从语法上讲,
    std::forward
    只是在做一个
    static\u cast
    。但是,由于转换为&&类型的特殊语法,此转换并不总是返回&&。是的,这很奇怪,但它解决了转发问题,所以没人在乎。这就是为什么它包含在
    std::forward
    中,而不必自己显式地执行
    静态转换

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

    没有显式强制转换(即:
    std::move

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

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

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

    std::move
    用于移动<代码>标准::转发
    用于转发。这听起来很油腔滑调,但正是这个想法。如果要移动对象,请使用
    std::move
    。如果要转发对象,请使用
    std::forward

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

    std::move
    始终返回一个&&。如果给它一个l值引用,它将返回一个r值引用。如果给它一个值类型,它将返回对该值的r值引用。等等

    std::forward
    并不总是返回&&。从语法上讲,
    std::forward
    只是在做一个
    static\u cast
    。但是,由于转换为&&类型的特殊语法,此转换并不总是返回&&。是的,这很奇怪,但它解决了转发问题,所以没人在乎。这就是为什么它包含在
    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 ?
    }