2012-07-09 14 views
60

Kodu:st ++ :: vector ve std :: array için C++ initializer_list davranışı neden farklı?

std::vector<int> x{1,2,3,4}; 
std::array<int, 4> y{{1,2,3,4}}; 

Neden std :: dizisi için çift küme parantezi gerekiyor?

+1

Std :: array' için ikinci sete ihtiyacınız var mı, yoksa sadece uyarı mı alıyorsunuz? std :: array y {1,2,3,4}; 'benim için çalışıyor. – bames53

+3

@ bames53: GCC bunu derlemekte yanlıştır. – Xeo

+10

@Xeo: Hatalı bir programın bir uyarı ile derlenmesi "yanlış" değil. –

cevap

55

std::array<T, N> bir topludır: kullanıcı tarafından bildirilen bir kurucu yok, bir std::initializer_list alarak bile. desteklerin başlatma agrega başlatma, C

agrega başlatma "eski tarz" miras edilmiş C++ bir özelliğini kullanarak gerçekleştirilir = kullanır: agrega bu eski tarzı ile

std::array<int, 4> y = { { 1, 2, 3, 4 } }; 

başlatma, ekstra parantez elided edilebilir, bu nedenle bu eşdeğerdir: Formbir bildiriminde

std::array<int, 4> y = { 1, 2, 3, 4 }; 

Ancak bu ekstra parantez sadece elided edilebilir""(C++ 11 §8.5.1/11), yani eski stil = kullanıldığında. Brace seçilmesine izin veren bu kural, doğrudan liste başlatması için geçerli değildir. Burada bir dipnot şöyle yazıyor: "Listenin başlatılmasının diğer kullanımlarında Braces kullanılamaz."

Bu kısıtlamayla ilgili bir hata raporu var: CWG defect #1270. Önerilen çözünürlük kabul edilirse, bağ elision liste başlatma diğer formları için izin verilecek ve şu iyi oluşacak: (. Hat ucu Ville Voutilainen için kusur raporu bulmak için)

std::array<int, 4> y{ 1, 2, 3, 4 }; 

std::array hiçbir oluşturucusu yok ve {1, 2, 3, 4} hazırladı init-liste değil std::initializer_list olarak yorumlanır aslında, ama std::array iç C tarzı dizisi için toplam başlatma (yani nerede ise
+2

Bunu bilmiyordum; Güzel. – chris

+10

"Tekdüze" başlatma için çok fazla ... – Mehrdad

+3

Yani "dizi" için sunulmakta olan soyutlama modelinin başarısızlığı mı? –

23

std::vector Çünkü bir std::initializer_list<T> yılında alan yapıcıya sunuyor ikinci parantez seti şunlardan gelir: std::array için bir e iç C stili üye dizisi).

+0

Vay, anladım, teşekkürler :) – Sungmin

İlgili konular