2014-09-18 32 views
2

類A定義的所有複製/移動的構造/分配如下被稱爲無複製/移動的構造/分配的同時初始化

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

main()功能是這樣的:

int main() 
{ 
    A a1 = f(A());   // Move-construct 
    A a2 = std::move(a1); // Move-construct 
    A a3 (std::move(a2)); // Move-construct 
    A a4 (a1);    // Copy-construct 
    A a5 = a4;    // Copy-construct 
    a5 = f(A());   // Move constructor + Move assignment 
    a5 = a4;    // Copy assignment 
    a5 = g();    // Move assignment 
    A a6 = g();    // None!! Member-wise assignment (?) 
} 

可有人告訴我,爲什麼地球上沒有任何一個構造函數和賦值操作符被調用a6? C++ 11文檔的哪一部分描述了這種行爲?

+5

http://en.wikipedia.org/wiki/Return_value_optimization – user1937198 2014-09-18 23:24:38

+2

「成員明智的分配」在這裏不是一個選項。你提供了你自己的'operator ='。 (並且'T x = y;'不是任何賦值)。 – 2014-09-18 23:35:32

+0

正在調用默認的構造函數,然後編譯器可以自由地刪除副本。不是很好! – 2014-09-18 23:37:00

回答

3

這被稱爲複製省略和在C++標準,部分12.8 PT被描述31.

當滿足特定條件時,一種實現被允許省略 類的複製/移動施工對象,即使爲拷貝/移動操作選擇的構造函數 和/或 對象的析構函數具有副作用。在這種情況下,執行對待 源和目標的省略複製/移動操作的簡單地2種 指相同的對象(...)

情節描述以及不同的方式。其中一個之中的:

當尚未結合至參考 將被複制的一個臨時的類對象/移動到具有相同的CV-不合格 類型的類對象時,複製/移動操作可以是通過直接構建 臨時物體插入省略副本的目標省略/移動

爲g()返回一個臨時匿名對象(未綁定到參考),是被直接構建到目標A6。在你的例子中,使用了g的return語句的默認構造函數。