SORU
9 Temmuz 2012, PAZARTESİ


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
9 Temmuz 2012, PAZARTESİ


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.)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Atlantic Records

    Atlantic Rec

    15 Aralık 2006
  • CareyHolzman

    CareyHolzman

    24 Ocak 2008
  • NextGenWindows

    NextGenWindo

    8 Kasım 2011