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
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.
Neden Java statik olarak bir sınıf bil...
Liste<Köpek> Listenin alt<Hay...
Neden değil't Veritabanı-Öneki.bö...
Neden kısa, ama int değişken değil ben...
Neden't iç içe geçmiş işlev kapan...