c neden initializer_list davranış için std::vector ve std::dizi farklı
Kod :
std::vector<int> x{1,2,3,4};
std::array<int, 4> y{{1,2,3,4}};
Neden std çift ayraç gerekiyor::dizi?
CEVAP
std::array<T, N>
toplama: kullanıcı-ilan kurucular, bir tane bile almadan std::initializer_list
. herhangi bir yok Başlatma parantez kullanılarak yapılırtoplu başlatmaC. devralınmıştır C bir özellik
"Eski stil" toplama başlatma kullanır =
:
std::array<int, 4> y = { { 1, 2, 3, 4 } };
Toplu baÅŸlatma bu eski stil ile, ekstra parantez bu eÅŸdeÄŸerdir yani elided, olabilir:
std::array<int, 4> y = { 1, 2, 3, 4 };
Ancak, bu fazladan diÅŸ teli sadece olabilir elided "beyan formu T x = { a };
" (C 11 §8.5.1/11), yani, ne zaman eski stil =
kullanılır . Bu kural brace elision izin doğrudan liste başlatma için geçerli değildir. Burada okur bir dipnot: "cannot listesi-başlatma diğer anlamları elided olmak Kaşlı."
Kusur raporu bu kısıtlama konusunda var: CWG defect #1270. Eğer önerilen kararı kabul etti ise, brace elision listesi başlatma diğer formları için izin verilecektir, ve aşağıdaki iyi biçimli olacak:
std::array<int, 4> y{ 1, 2, 3, 4 };
(Ville için şapka ucu kusur raporu bulmak için Voutilainen.)
Neden&; dizi yineleme için... "* o kad...
Neden Java bize bir isim dosya adından...
Neden GCC neredeyse aynı C kodu için t...
::push_back vector) kullanır değeri, s...
Neden bir dizi İterable için atanabili...