SORU
12 AĞUSTOS 2015, ÇARŞAMBA


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
12 AĞUSTOS 2015, ÇARŞAMBA


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.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Marques Brownlee

    Marques Brow

    21 Mart 2008
  • Thom Hall

    Thom Hall

    24 Kasım 2006
  • WePlayWeWatch

    WePlayWeWatc

    3 Temmuz 2013