Neden kütüphanenin 'in vector<bool>::const_reference bool değil mi?
Bölüm 23.3.7 Sınıf vector<bool>
[vektör.bool], paragraf 1, devletler:
template <class Allocator> class vector<bool, Allocator> {
public:
// types:
typedef bool const_reference;
...
Ancak bu program kütüphanenin kullanırken derlemek için başarısız :
#include <vector>
#include <type_traits>
int
main()
{
static_assert(std::is_same<std::vector<bool>::const_reference, bool>{}, "?");
}
Ayrıca C standardı bu şartname C 98'e geri tüm yol tutarlı olduğunu unutmayın. Ve ben daha fazla kütüphanenin sürekli değil, kütüphanenin ilk giriş beri bu şartname takip ettiğini unutmayın .
Bunun için motivasyon-uygun olmayan nedir?
CEVAP
Motivasyon için bu sütunluk algılanabilir tarafından uygun bir program, ve böylece olmayan uyumlu, vector<bool>
davranmasına daha fazla gibi vector<char>
ile ilgili kaynaklar (sabit ve aksi).
Giriş
1998, vector<bool>
"pek bir kap." olarak alay beri LWG 96 ilk LWG konulardan biri, tartışma başlattı. Bugün, 17 yıl sonra, vector<bool>
büyük ölçüde değişmeden kalır.
This paper vector<bool>
davranış vector
böylece genel kod acıyor her örnekleme farklıdır bazı belirli örnekler gider. Ancak uzunluğu çok güzel performans vector<bool>
özellikleri aynı kağıt anlatılır eğer düzgün bir şekilde uygulandığı takdirde olabilir.
Özet: vector<bool>
kötü bir kap değil. Aslında oldukça yararlıdır. Sadece kötü bir adı vardır.
const_reference
geri
Yukarıdaki gibi tanıttı, ve vector<bool>
hakkında kötü ne detailed here farklı vector
Diğer örneklemesi daha genel bir kod davranır. İşte somut bir örnek:
#include <cassert>
#include <vector>
template <class T>
void
test(std::vector<T>& v)
{
using const_ref = typename std::vector<T>::const_reference;
const std::vector<T>& cv = v;
const_ref cr = cv[0];
assert(cr == cv[0]);
v[0] = 1;
assert(true == cv[0]);
assert(cr == cv[0]); // Fires!
}
int
main()
{
std::vector<char> vc(1);
test(vc);
std::vector<bool> vb(1);
test(vb);
}
Standart özellikleri // Fires!
tetikleyecek, ama test
vector<bool>
ile çalıştırıldığında, işaretli iddia ettiğini söylüyor. vector<char>
bir (veya varsayılan olmayan bir uygun T
atandığında bool
*ayrıca 22*) ile çalıştırın, test başarılı olur.
Kütüphanenin uygulama vector<bool>
farklı davranır olan olumsuz etkilerini en aza indirmek için genel kod olarak çalıştı. Bunu başarmak için yaptım bir şey vector<T>::const_reference
bir hale getirmektirproxy-başvurubunun dışında sadece belirtilen gibi vector<T>::reference
ile atayabilirsiniz. Bu, kütüphanenin , vector<T>::const_reference
aslında biraz iç bir işaretçi vector
yerine, parça parça bir kopyası.
Kütüphanenin test
yukarıdaki vector<char>
vector<bool>
de geçer.
Maliyeti ne?
Dezavantajı bu uzantı soru gösterildiği gibi detectible. Ancak, çok az sayıda program aslında bu diğer ad tam türü hakkında bakım ve daha fazla program davranışını önemsiyorum.
Bunun için motivasyon-uygun olmayan nedir?
Kütüphanenin istemci genel kod daha iyi davranış vermek, ve belki de yeterli alan test ettikten sonra, tüm C sektörünün iyileştirilmesi için gelecek C bir standart için bu uzantı öneriyorum.
Böyle bir teklif çıkabilir şeklinde yeni bir konteyner (örneğin bit_vector
) aynı API bugün vector<bool>
ama birkaç yükseltmeleri gibi const_reference
tartışıldı burada. Admin (ve nihai temizleme) vector<bool>
uzmanlık izledi. bitset
ayrıca bu bölüm, örneğin const_reference
ekleyin ve kullanımına bir dizi küçük bir yükseltme kullanabilirsiniz.
Bu, gez bitset
array
43 ** olarak 40 ** bit_vector
-- adlandırılması gereken ya da her neyse) için. Ve benzetme vector
array
value_type
ya bool
bahsediyoruz olmasam da, gerçek tutar.
Kütüphanenin içinde uzantıları olarak başlayan C 11 ve C 14 özellikleri birden fazla örnek var . Bu standartları nasıl gelişir. Gerçekgösterdiolumlusaha deneyimi güçlü etkisi taşır. Standartlar halk mevcut özellikleri olması gerektiği gibi) değiştirmek için geldiğinde muhafazakar bir demet. Sanırım doğru tahmin olduğundan emin olsanız bile, uluslararası alanda kabul görmüş bir standart gelişen için riskli bir strateji.
Neden İşlev<T,bool > Predicate< y...
Neden kullanın !! ne zaman int bool dö...
Neden int bir alt sınıfı bool mi?...
Neden't Sözlük<bool? bir, için...
Neden bir performans dökme " ifadesini...