簡體   English   中英

聚合和列表初始化有什么區別

[英]what is the difference between aggregate and list initialization

我試圖了解聚合和列表初始化之間的區別。 特別是這里提到聚合初始化允許縮小但情況似乎並非如此

#include <type_traits>

struct A {
    int y;
};

static_assert(std::is_aggregate_v<A>);

int main() {
    A a{10.0};
}

錯誤:

<source>: In function 'int main()':
<source>:10:9: error: narrowing conversion of '1.0e+1' from 'double' to 'int' [-Wnarrowing]
   10 |     A a{10.0};
      |         ^~~~
ASM generation compiler returned: 1
<source>: In function 'int main()':
<source>:10:9: error: narrowing conversion of '1.0e+1' from 'double' to 'int' [-Wnarrowing]
   10 |     A a{10.0};
      |         ^~~~
Execution build compiler returned: 1

非常簡短地回答你的問題。

我相信該博客的作者在談論 C++11 之前的標准。 在 C++11 之前,收縮轉換是可能的,但現在它們被禁止了。

如果您使用 g++ 進行編譯,請刪除#includestatic_assert並使用-std=c++03編譯標志運行它,代碼將運行(但應該發出警告)。 從 c++11 及更高版本開始,縮小轉換是被禁止的。

您可以在此處閱讀有關聚合初始化的更多信息:

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

希望能幫助到你: :)

另一個答案對於您所展示的程序的具體行為是正確的,但是要直接回答標題中的問題:

列表初始化是使用{/*...*/}= {/*...*/}形式的初始化程序的任何初始化。

(至少在 C++20 之前)聚合初始化是一種特定類型的列表初始化,如果正在初始化的類型是聚合類型(即數組或沒有用戶聲明的類(*不完全是之前C++20)構造函數,只有public非靜態數據成員,沒有虛函數)。 它對於其他形式的初始化是特殊的,因為它不調用構造函數,而是從大括號中的初始化器列表中逐一初始化聚合的子對象。

自 C++20 以來,還有一種使用括號的聚合初始化的替代形式,因此上述內容可能不再完全正確。

禁止縮小轉換的規則適用於所有列表初始化,而不是專門用於聚合初始化。 它也不適用於帶括號的聚合初始化。

所有這些僅適用於 C++11。 在 C++11 之前,唯一可能的大括號初始化是聚合初始化,並且不禁止縮小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM