1

如何使用列表初始化語法初始化C++ 14中的聚合類型?如何使用列表初始化值來初始化聚合類型

Aggregate_t {}; 

這被視爲聚合初始化,其產生錯誤或警告的用於未初始化Aggregate_t成員。

這可能嗎?

EDIT:實例

struct Aggregate_t { 
    int x; 
}; 

int main (int, char**) 
{ 
    Aggregate_t {}; 
    return 0; 
} 

與克編譯++ - 4.9.2:

main.c++: In function ‘int main(int, char**)’: 
main.c++:7:16: warning: missing initializer for member ‘Aggregate_t::x’ [-Wmissing-field-initializers] 
    Aggregate_t {}; 
      ^
+5

請發佈[MCVE](http: //stackoverflow.com/help/mcve),以及你得到的錯誤。 – juanchopanza 2015-02-23 14:01:35

+2

這應該與值初始化具有相同的效果(除非自C++ 11以來發生了一些變化 - 我還沒有完全更新)。你真的得到錯誤,或只是過分熱心的警告?另外,請向我們展示'Aggregate_t'的定義,以便我們可以檢查它是否真的是一個聚合。 – 2015-02-23 14:02:22

+0

這可能是一個過分熱衷的警告,但問題更多地是關於初始化的影響。如果未初始化的聚合初始化成員被初始化(根據標準),那麼我想這是我的問題的答案。 – 2015-02-23 14:10:43

回答

2

[dcl.init.aggr]

7 - 如果有更少的初始化子句中列出的成員數量大於成員總數,則未初始化的每個成員應初始化[C++ 14:從其括號或等值初始化程序或者如果沒有括號或等價初始化器,]從一個空的初始化器列表(8.5.4)。

所以g ++是過度熱鬧的警告;我不知道有什麼辦法可以避免它,同時在警告有效的情況下保留它,當然除了使用複製初始化和預期的複製省略:

Aggregate_t a = Aggregate_t(); 
+0

我也在cppreference.com中發現它:「如果初始化子句數小於成員數或初始化子句完全爲空,則其餘成員將通過它們的括號或相等初始值設定項初始化,如果在類中提供定義,否則由空列表執行值初始化。「所以,它通常應該具有與值初始化相同的效果。 – 2015-02-23 18:15:31

+0

這一點不必訴諸於 - ()語法來避免gcc的警告。似乎無法完成,所以,謝謝! – 2015-02-23 18:35:41

+1

正如警告的名稱所示,「-Wmissing-field-initializers」適用於缺少初始化程序 - 即使正在初始化基礎的東西(按照[手冊](https://gcc.gnu.org/) onlinedocs/GCC /警告 - Options.html))。然而它的設計有例外,空括號就是其中之一。根據我的經驗,GCC並不擅長這一點,所以如果你確信它不會隱藏錯誤,我會推薦'-Wno-missing-field-initializers'。 – 2015-02-25 10:11:54