2017-06-20 71 views
14

the different meanings of a curly-brace enclosed list hakkında bir sorum var.Neden GCC 6.3, bu Cümle Oluşturma Listesi kodunu açık C++ 11 desteği olmadan derler?

C++ 03'ün C++ 11'in initializer_list desteklemediğini biliyorum. Bu işe neden üzerinde

map<string, string> interpolate = { { "F", "a && b && c" }, { "H", "p^2 + w" }, { "K", "H > 10 || e < 5" }, { "J", "F && !K" } }; 

I was challenged ve ben bir cevap olmadığını gördüler: Ancak, hatta -std=c++11 derleyici bayrağı olmadan, bu kodla 6.3 will properly initialize interpolate gcc'ye. Bu bir Brace-Init-List'tir, ancak standart bir kapsayıcıyı başlatmak için ondan aldığımız yol tipik olarak bir initializer_list'dur. Öyleyse C++ 11 kodu başlatma işlemini nasıl gerçekleştirir?

+2

Bu soruyu 'Hot Network Questions' Listesine yaptığım için oldukça şaşırdım: | Bu gcc tarafından belgelenmiş olduğunu düşündüm ve daha fazla gcc – P0W

+1

@ P0W varsayılan derleme bayrakları hakkında internette çeşitli yerlerde biraz şaşırdım. Sorduğum anda, varsayım, gcc 5'te varsayılan davranışa benzer şekilde, "-std = C++ 98" kullanıyordum. Sanırım aynı önyargıya sahip olan pek çok insan oldu. Endişelenme, sadece bir sapma olduğundan eminim, normal C++ down-vote oranı yakında geri yüklenmelidir. –

cevap

33

default compiler command for gcc 6.x is -std=gnu++14, dolayısıyla derleyici, C++ dil standardının sonraki bir sürümünü kullanarak örtük olarak kodunuzu derliyor.

C++ 03'te derlemek istiyorsanız, -std=c++03'u manuel olarak belirtmeniz gerekir.

+18

Daha ilginç bir soru, insanların yeni bir derleyicinin 14 yaşında bir standart için hala geçerli olmasını beklemesinin nedeni! Her neyse, 'g ++' 6'nın bunu yapmayı bırakması çok güzel bir şeydi, ama dileklerin herhangi bir uzantı olmadan 'C++ 14' olmasını isterdim; Aksi takdirde, insanlar varsayılan olarak g ++ 'nin izin vermesinin iyi tanımlanmış olmasını garanti eder, ki bu durum böyle değildir. –

+3

Bunu yapmak için bir varsayım kadar mantıklı değil, @underscore_d. Varsayılanları seçmek için iki temel strateji vardır: (A) düşündüğünüzü en çok istenen şekilde yapın veya (B) bunları mümkün olduğunca başarısızlık durumuna getirin. Eğer strateji (B) kullanıldıysa, C++ 03'e varsayılan değer vermek mantıklı olacaktır. Bu ayrıca, mevcut kod tabanlarının derleyicinin daha sonraki bir sürümüne yükseltilmesini de kolaylaştırır; bu strateji (A) ciddi bir şekilde karmaşık bir hale gelir ki, bu derleyici ile derlenen tüm kodların * yeni * kodu olduğu varsayılırsa. Yine de, Gnu uzantılarına öntanımlı olarak katılmadık! –

+3

@CodyGray Right, iyi puanlar. Artı, varsayılan standardın olacağı beklentisi ... vintage'in bir emsali var: 'g ++' 5 hala _C++ 98_, fer goodness 'sakes için varsayılan! –