SORU
4 Mart 2013, PAZARTESİ


't neden std::initializer_list bir dil, yerleşik?

Neden 3* *temel dil yerleşik bir değil mi?

C 11 önemli bir özellik ve henüz kendi ayrılmış anahtar kelime yok (ya da benzeri) pek uymuyor gibi geliyor bana.

Bunun yerine, initializer_listsadecebir özel, örtülü olan standart kütüphaneden şablon bir sınıfeşlemeyeni gelenhazırladı-ınit-listesi{...} derleyici tarafından işlenen bu sözdizimi.

İlk düşünce, bu çözüm oldukçahacky.

C dili için yeni eklemeler şimdi uygulanacak bu şekildeörtülü rolleribazı şablon sınıfları ve tarafından değilçekirdekdil?


Bu örnekleri göz önünde bulundurun:

   widget<int> w = {1,2,3}; //this is how we want to use a class

neden yeni bir sınıf seçildi

   widget( std::initializer_list<T> init )

bir şey yerinebenzerbu fikir için:

   widget( T[] init, int length )  // (1)
   widget( T... init )             // (2)
   widget( std::vector<T> init )   // (3)
  1. klasik bir dizi, muhtemelen const oraya buraya ekleyebilirsiniz
  2. üç nokta zaten dili (var-besten, şimdi variadic şablonları) var, neden yeniden kullanım sözdizimi değil (ve hissettirecekbuilt-in)
  3. sadece konteyner mevcut, const & ekleyebilirsiniz

Hepsi zaten dilinin bir parçasıdır. Ben sadece 3 ilk fikirlerimi yazdım, emin değilimbirçokdiğer yaklaşımlar.

CEVAP
4 Mart 2013, PAZARTESİ


C Standart Komitesi gibi tercih değil eklemek için yeni anahtar kelimeler, muhtemelen çünkü bu riskini kırma varolan kodu (eski kod için anahtar kelime olarak adı bir değişken, bir sınıf, ya da her neyse).

Eğer bir kelime, ne onun altında yatan tip erişim misiniz? olsaydı ayrıca, şablonu esas alan bir kap gibi std::initializer_list tanımlama zarif bir seçimdir oldukça bana öyle geliyor ki: Nasıl yineleme misin? Yeni operatörler bir sürü de gerekir, ve bu sadece daha isimleri hatırlamak ve daha fazla anahtar kelime standart konteynerler ile aynı şeyleri yapmaya zorlayacaktır.

Başka bir kap gibi std::initializer_list bir tedavi bunların hiçbirini çalıştığı genel kod yazma imkanı verir.

GÜNCELLEME:

Neden yeni bir türü, varolan bir arada kullanarak yerine tanıtmak?(açıklama)

Öncelikle, diğer kaplar derleyici tarafından oluşturulan bir koleksiyon için uygun değildir, ekleme ve kaldırma, ve emplacing elemanları, yöntemleri var. Tek istisna, bir sabit boyutlu C-style dizi sarar ve bu nedenle sadece makul aday kalacak olan std::array<>.

Nicol Bolas düzgün yorumlarda belirttiği gibi, ancak, başka, std::initializer_list arasındaki temel fark, ve tüm diğer standart konteyner (std::array<> da dahil olmak üzere) ikinci olanlar vardeğer semantiğistd::initializer_list varken ., ^em>başvuru anlambilim. std::initializer_list örneğin, öğelerin bir kopyasını neden olmayacak bir kopyalama içerir.

Ayrıca (bir kez daha, nezaket Nicol Bolas), tut-başlatma listeleri için özel bir kap olan kullanıcı başlatma gerçekleştirme yolunda aşırı yükleme sağlar.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Miles Fisher

    Miles Fisher

    8 NİSAN 2009
  • UKF

    UKF

    2 Aralık 2009
  • VOICE TV

    VOICE TV

    2 Aralık 2010