2014-03-05 26 views
1

我已經從幾個來源受到教育,在C++ 11中,函數的返回值可以從由命名局部變量組成的返回語句移動構建。例如:返回語句綁定rvalue引用左值?

class A {}; 

A f() { 
    A a; 
    return a; 
} 

int main() { 
    f(); 
} 

即,在C++ 11中,prvalue臨時通過函數調用表達式f()指定距離函數的局部變量a布展構造,而不是拷貝構造如在C++中03。當然,從語義上講,在進行任何級別的優化之前,複製elision,NRVO等。

我的問題是,A的移動構造函數的參數是A&&,它只能綁定到一個prvalue還是xvalue,對嗎?那麼哪個特定的例外規則允許它在這裏綁定到左值a?謝謝。

+0

您是否加入了此代碼?我懷疑它是否符合你的想法。對於你沒有捕獲f()的返回值。 – Dan

+0

@丹:是的,我試過了,它是被調用的移動構造函數,而不是複製構造函數。您可以通過明確定義公共副本構造函數和私有移動構造函數來嘗試自己。它將無法編譯。 – goodbyeera

回答

5

哪個特定的異常規則允許它在這裏綁定到左值?

12.8[class.copy]/32

當的複製操作的省音的標準被滿足或一個事實,即所述源對象是一個功能參數,以及將被複制被指定的對象將被滿足節省通過左值,首先執行重載解析以選擇副本的構造函數,就好像該對象由右值指定一樣。

+0

感謝這個標準摘錄。這似乎是我的問題的答案。無論如何,我並不完全理解「除了源對象是一個函數參數」這個事實之外,還會遇到這樣的措詞。「那是什麼意思?你會如此善意地闡述一點嗎?再次感謝。 – goodbyeera

+0

@goodbyeera只是指本段涉及的複製省略標準,它排除了函數參數。 'A f(A a){return a; }'不允許複製,但是執行移動。 – Cubbi