2011-08-26 84 views
1

我有3个问题:绑定修改的右值引用到修改的左值

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

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

  3. 什么的std ::移动和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 ? 
} 

回答

3

1>能否直接结合一个左值到右值引用?

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

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

什么,直到它实际上是感动。所有std::move所做的都是返回r值的参考。实际的移动发生在所讨论类型的移动构造器/赋值中。

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

std::move是为了移动; std::forward用于转发。这听起来很滑稽,但这就是主意。如果您打算移动对象,则使用std::move。如果您打算要转发对象,请使用std::forward

转发是指采用特殊的语义,允许引用的类型之间的转换,从而使基准性质的调用之间保存。所有这些的细节都非常...技术性。

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

std::forward总是返回& &。在句法上,std::forward只是在做一个static_cast<T&&>。但是,由于围绕着铸造到& &类型的专门语法,此演员阵容并不总是会返回& &。是的,这很奇怪,但它解决了转发问题,所以没人关心。这就是为什么它包含在std::forward中,而不必自己明确执行static_cast

1

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

问题2.什么也没有发生。 std::move只是将东西投射到右值。

然而,如果你使用std::move通过mS(或myStr)到foo,则该功能可能认为它可以“偷”的对象,因此mS可能会在函数调用后在未指定状态结束。