2015-12-18 33 views
5

Neden std::bitset::reference ve std::vector<bool>::reference açık bir yıkıcıyı (derleyici oluşturulmamış) belirtir neden merak ediyorum. Örneğin, boost::dynamic_bitset::reference böyle bir yıkıcı belirtmiyor gibi görünüyor. Standart bir yıkıcısı olarak ~reference() bahsederNeden C++ standardı std :: bitset :: reference için bir yıkıcıyı belirtir?

+8

Birisi 1990'larda bu kadar yazdım ve kimse beri bunu değiştirmeye önerdi? Başka sebep yok sanırım. –

cevap

3

diye, (libstdc++ ve SGI/STL bunu nasıl olan) o kullanıcı tarafından sağlanan bir no-op {} olarak olması gerektiği anlamına gelmez. Ayrıca, kullanıcı tarafından =default olarak bildirilebilir veya hatta örtülü olarak tanımlanmış olabilir (libc++ bunu nasıl yapar?). Ne olursa olsun, Standart kaldırılan yıkıcı sözünü açık olacak şekilde güncellenebilir. Yazımsal bir değişiklik yapabilirsin (bunun gerçek bir teklif olduğunu düşünmüyorum).

@BoPersson tarafından yorumlarda belirtildiği gibi, std::bitset, Standard Library'nin çok eski bir bileşenidir. Özelliklerinin çoğu (imzasız tamsayı örtülü kurucu, üye olmayan operator== yerine üye) 1998'de dil standardizasyonundan önce. Utanmaz fişler: bkz. Bunun nasıl ortaya çıkabileceğiyle ilgili daha fazla tartışma için this Q&A ve neden düzeltilebileceğini öğrenmek için this Q&A.

<rant mode>

std::bitset mirası dışına iyi yolu namespace experimental bir temiz olacak olacaktır. Tercihen, bu aynı zamanda std::bitset'un karışık soyutlamasını da çözer ve aynı zamanda array<bool>'un yanı sıra set<int>'un bir alan optimize edilmiş versiyonu olmaya çalışır. İdeal olarak, bu soyutlamaları sağlayan bir bool_array<N> ve bir bounded_int_set<N> için bir teklif olacaktır. Benzer şekilde, bool_vector<Alloc> (şu anda vector<bool, Alloc> olarak bilinir) ve int_set<Alloc> (şu anda boost::dynamic_bitset ve boost::container::flat_set<int, Alloc>'un bir karışımı) tanımlanabilir.

</rant mode>