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?
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?
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
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).
Vay, anladım, teşekkürler :) – Sungmin
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
@ bames53: GCC bunu derlemekte yanlıştır. – Xeo
@Xeo: Hatalı bir programın bir uyarı ile derlenmesi "yanlış" değil. –