2011-08-26 83 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可能會在函數調用後在未指定狀態結束。