SORU
16 Aralık 2014, Salı


Neden't `değil std::initializer_list` edebi bir tür olarak tanımlanmış?

Bu bir takip bu soru: Is it legal to declare a constexpr initializer_list object?.

C beri 14, std::initializer_list Sınıf tüm yöntemleri constexpr ile işaretlenmiş. Doğal yaparak bir örneğini başlatmak için mümkün gibi görünüyor constexpr std::initializer_list<int> list = {1, 2, 3}; ama Çınlama 3.5 list ilgili sabit bir ifade tarafından başlatılmış şikayetçi değil. As dyp pointed out in a comment, std::initializer_list edebi bir türü için herhangi bir gereklilik gözlük yok gibi görünüyor.

Hatta gibi başlatmak eğer bir sınıf tamamen constexpr olarak tanımlanmış olmasının anlamı nedir? Standart bir gözetim ve gelecekte sabit olacak mı?

CEVAP
23 Ocak 2015, Cuma


Standart Komitesi initializer_list edebi bir tür olma niyetinde gibi görünüyor. Ancak, kesin bir gerekliliği var gibi görünmüyor, ve standart bir hata gibi görünüyor.

§ 3.9.10.5:

Bir türedebi türeğer varsa:
- aşağıdaki özellikleri: tüm sınıfı türü (Madde 9)
- önemsiz bir yıkıcı vardır
- - bir toplama türü (8.5.1) veya en az bir tane varconstexprbir kopya değil ya da yapıcı hareket eden kurucu veya kurucu şablonu, ve
- - statik olmayan veri üyeleri ve temel sınıflar tüm uçucu olmayan değişmez türleri vardır.

§ 18.9.1:

namespace std {
  template<class E> class initializer_list {
  public:
    /* code removed */
    constexpr initializer_list() noexcept;
    // No destructor given, so trivial
    /* code removed */
  };
}

Bu birinci ve ikinci gereksinimleri karşılar.

Üçüncü şartı olsa için:

§ 18.9.2 (vurgu benim):

8 ** türü bir nesne türü nesne const E bir dizi erişim sağlar. [Not:İşaretçileri veya bir işaretçi artı bir uzunluk bir çiftinitializer_list apaçık beyan olur. initializer_list 8.5.4 belirtilen başlatıcı listeleri uygulamak için kullanılır. Başlatıcı listesi kopyalama temel unsurları kopyalamaz.
—son not]

Yani orada bir gereksinim için özel üyeler uygulanması initializer_list için uçucu olmayan değişmez türleri, ancak, çünkü onlar söz inanıyorlar bir çift işaretçileri veya bir işaretçi ve bir uzunluk olacaktır "açık gösterimi," muhtemelen yoktu düşünün biri olabilir koymak olmayan bir şey değişmez üyeleri initializer_list.

Hem çınlama bir hata ve standart olduğunu, muhtemelen söyleyebilirim.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 8bitdigitaltv

    8bitdigitalt

    31 AĞUSTOS 2011
  • ElChakotay Andrich

    ElChakotay A

    10 EKİM 2013
  • Xbox

    Xbox

    1 Kasım 2005