2015-01-23 14 views
15

Compound Literals bir C99 yapısıdır. Ben C++ yapabilirsiniz olsa:Bileşik değişmezleri Standard C++?

#include <iostream> 
using namespace std; 

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

örneğin MSVC bunu as an extension destekler görünüyor. Yine de bütün derleyiciler elime geçebilir, yukarıda belirtilen kodu derleyebilirim.

Bu özellik C++ 14 kullanılabilir mi? Farklı bir standart terim var mı (Bana sadece varsayılan başlatmayı kullanarak geçici olarak oluşturmak gibi görünüyor)?


Yan Not: (yukarıda çağırmalıdır ne olursa olsun ya da) "Bileşik Değişmez" olduğu bir pack expansion context Bu bir uzantısı olduğunu hem gcc ve clang desteğidir

+3

Ugh, 'std :: array ' kullanın ve güvenli olduğunu biliyorsunuz, neden rahatsız? – stefan

+0

Bunu standart olup olmadığını bilmeden de kullandım. –

+1

@stefan Kinda ne kullandığımı bilmek ister ... kelimenin tam anlamıyla yukarıdaki kodu nasıl arayayım? –

cevap

22

(sadece bir işlevsellik söz). Gcc dokümanı:

GCC, C90 modunda ve C++'da bileşik literalleri desteklemektedir, ancak C++'da semantikler biraz farklıdır. Eğer -pedantic üzerine bina

Eğer clang der, örneğin, (see it live) bir uyarı almalıdır:

uyarı: bileşik değişmez bir C99-spesifik bir özelliği vardır [-Wc99-uzantıları]

Not, C++ 'daki anlamsal farklar küçük değildir ve C99'da iyi tanımlanmış olan kod C++' da tanımlanmamış bir davranışa sahip olabilir:

C++ 'da, bileşik bir literal, tam ifadesinin sonuna kadar yalnızca 'un yaşadığı geçici bir nesneyi belirtir. Sonuç olarak, bir bileşik hazırlayıcının alt nesnesinin adresini alan iyi tanımlanmış C kodu, C++ 'da tanımsız olabilir.

21
(float[2]) {2.7, 3.1} 

değişmez bir C99 bileşiktir. Bazı derleyiciler C++'da bir uzantı olarak destekliyorlar. Msgstrc ( ). ( ). , bir sözdizimi hatası. iki float s geçici dizi listesi-başlatır ++ Verilen using arr = float[2];

,

arr {2.7, 3.1} 

geçerli C'dir.

{2.7, 3.1} 

bir hazırladı-init-liste denir.

Son olarak, kodu için,

for (auto i : {2.7, 3.1}) cout << i << endl; 

eserleri eşit derecede iyi ve ++ tamamen geçerli C - Bu başlık altında bir std::initializer_list<double> oluşturur. Gerçekten float s istiyorsanız, numaralara f son ekini ekleyin.