2016-09-06 117 views
20

初始化具有默認值的結構體結構是簡單的:括號(集合)初始化爲具有默認值

struct X { int a; int b = 2; }; 

和初始化用支架初始化一個結構是微不足道的太:

X x = {1, 3}; 

令人驚奇的init代碼不會編譯,直到我刪除默認值。那麼,我如何在這種情況下做init?我想讓X POD沒有C-tor。

+4

只是FYI:與C++ 14,代碼編譯。 – Mine

+1

記錄在這裏:http://en.cppreference.com/w/cpp/language/aggregate_initialization – Hayt

+2

'聚合的定義被改爲顯式排除任何具有成員初始值的類;因此,他們不允許使用聚合初始化。 C++ 14放寬了此限制,允許在這些類型上進行聚合初始化。如果加載的初始化列表沒有爲該參數提供一個值,那麼成員初始化程序就會處理它,所以基本上,如果沒有C-tor,C++ 11中不可能存在代碼。只有C++ 14 –

回答

18

下面是一些與問題相關的文檔:

http://en.cppreference.com/w/cpp/language/aggregate_initialization

你的代碼是無效的。在它再次有效。

在C++ 11中添加一個默認的初始化可以防止braced init有效。在C++ 14中,它沒有。

在C++ 11中解決您的問題的一種方法是編寫一個構造函數,其中a和b的值爲默認值。

+0

在我原來的答案中有一些錯誤信息。編輯它到正確的解決方案,但留下原來的答案,因爲POD性能似乎也與OP – Hayt

+0

相關我編輯了**原始**和**編輯**部分,合併部分仍然有效的一旦編輯的部分在那裏,原始的一個。如果有人想看歷史,他們可以點擊歷史鏈接。我的修改是否保留了原來的意圖?如果沒有,請隨時回滾,但我建議您放棄編輯/原始模式。 – Yakk

+0

消息仍然相同。當時我認爲這很好(當信息沒有upvotes並且不被接受時)向OP表示我的初步答案不是他正在尋找的答案。現在它被接受+這裏唯一的答案,我可以看到,這是更好的方式。 – Hayt