簡體   English   中英

復合文字是標准C ++嗎?

[英]Are compound literals Standard C++?

復合文字是C99構建體。 即使我可以在C ++中做到這一點:

#include <iostream>
using namespace std;

int main() {
    for (auto i : (float[2]) {2.7, 3.1}) cout << i << endl;
}

似乎MSVC例如支持它作為擴展 但是,我可以投入使用的所有編譯器都可以編譯上述代碼。

那么,此功能在C ++ 14中可用嗎? 是否有一個不同的標准術語(在我看來,這就像使用支撐初始化創建一個臨時目錄一樣)?


旁注 :“復合文字”(或上面我所說的任何東西)是包擴展上下文 (僅提及功能)

這是gccclang支持的擴展。 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.

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