[英]Are compound literals Standard C++?
這是gcc和clang
支持的擴展。 gcc文件說:
作為擴展,GCC在C90模式和C ++中支持復合文字,盡管C ++中的語義有些不同。
如果使用-pedantic進行構建,則應收到警告,例如clang
表示( 實時查看 ):
警告:復合文字是C99特定的功能[-Wc99-extensions]
請注意,C ++中的語義差異並不小,在C99中可以良好定義的代碼在具有此擴展名的C ++中可能具有未定義的行為:
在C ++中,復合文字指定了一個臨時對象,該對象僅生存到其完整表達式的結尾。 結果,定義良好的C語言代碼(使用復合文字的子對象的地址)可能無法在C ++中定義。
(float[2]) {2.7, 3.1}
是C99復合文字。 一些編譯器在C ++中將其作為擴展支持。
float[2] {2.7, 3.1}
是語法錯誤。
給定using arr = float[2];
,
arr {2.7, 3.1}
是有效的C ++,它對兩個float
的臨時數組進行列表初始化。
{2.7, 3.1}
被稱為braced-init-list 。
最后,對於您的代碼,
for (auto i : {2.7, 3.1}) cout << i << endl;
同樣有效,並且是完全有效的C ++-這在std::initializer_list<double>
構造了一個std::initializer_list<double>
。 如果確實需要float
,則將f
后綴添加到數字中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.