2013-10-13 51 views
6

「我們可以initializate爲此我們沒有使用定義 任何構造函數的類的對象。拷貝構造函數的花括號初始化

  • 按成員初始化
  • 拷貝初始化
  • 默認初始化。

例如:

struct Work { 
     string author; 
     string name; 
     int year; 
    }; 

    Work s9 { "Bethoven", 
       "Symphony No. 9 in D minor, Op. 125; Choral", 
       1824 
      };     // memberwise initialization 

    Work currently_playing {s9}; // copy initialization 
    Work none {};     // default initialization 

The C++ Programming Language 4th Ed。章17.3.1

例如:

struct Data 
    { 
     int mMember1; 
     float mMember2; 
     char mMember3; 
    }; 

    int main() 
    { 
     Data aData_1{1,0.3,33}; 
     Data aData_2{aData_1}; 

     return EXIT_SUCCESS; 
    } 

這必須工作,althought我得到一個編譯錯誤儘可能多的與海灣合作委員會與鏘。這兩個編譯器中的錯誤是「無法將數據轉換爲整數」。但是,實現複製構造函數這個錯誤消失或不實現它,但使用圓括號語法。問題是有點愚蠢,改變圓括號的問題得到解決。但爲什麼不遵循TC++ PL的規則?是一個彙編問題還是我誤解了某些東西?提前致謝。

+0

這是由一個DR修復到C++ 14,[請參閱此處](http://stackoverflow.com/questions/31776359/explicit-copy-constructor-and-uniform-initialization/31776937) –

回答

9

我認爲行爲與8.5.4(列表初始化),第3句符合:

對象或T類型的參考的列表的初始化被定義如下:

- 如果T是一個聚合,執行聚合初始化(8.5.1)。

[...]

- 否則,如果初始化列表具有E類型的單個元件[...]的對象或參考是從元件初始化;

您所期望的第二個項目在我的縮寫報價申請,但第一項優先:由於Data確實是一個總的一個元素的列表子句從來沒有考慮過。


您對該書的引用似乎是known error。據稱該語言將被修正以匹配C++ 14中的書。

+0

我已編輯來自您的答案的消息和我已經在書中包含代碼。在這段代碼中似乎應用了第二種行爲。 – JoseLuis

+0

@JoseLuis這本書根本不正確。這個工作可能是支持初始化提議的作者的意圖,但如果是這樣的話,他們沒有成功地指定這一點。 – bames53

+0

@JoseLuis:請參閱[勘誤表](http://www.stroustrup.com/4th.html),據稱已在C++ 14中修復。 –