[英]What is the difference between these two forms of list initialization for std::map?
[英]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++ 進行編譯,請刪除#include
和static_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.