2015-03-26 19 views
9

std::basic_string ile documented here ve here olan Howard Hinnants's C++11 stack allocator, biraz değiştirilmiş bir versiyonu kullanılarak ve aşağıdaki örnek (see it live) libstdc++ kullanılarak olan gcc ile derleme:C++ 11, ayırıcıların varsayılan yapılandırılabilir olmasını gerektirir mi, libstdC++ ve libC++ katılmıyor mu?

const unsigned int N = 200; 

arena<N> a; 
short_alloc<char, N> ac(a) ; 

std::basic_string<char,std::char_traits<char>,short_alloc<char, N>> empty(ac); 

diğerleri arasında aşağıdaki hata (verir):

error: no matching function for call to 'short_alloc<char, 200ul>::short_alloc()' 
    if (__n == 0 && __a == _Alloc()) 
        ^

çalışır Ancak clang ile derlerken ve libc++ (see it live) kullanarak hata olmadan. std::basic_string'un stdlibc++ uygulamasının, uygulanmasının, varsayılan değer oluşturucusunun almasını bekler.

C++ 11, ayırıcıların varsayılan yapılandırılabilir olmasını gerektirir mi? Hangi uygulama doğrudur? değil

+2

Kendinden cevaplanan soruları kullanarak Biz bu teyit edebilir

(yeni dize ABI kullanırken)

GCC 5 için sabit otomatik olarak bir downvote olsun. Kim olduğuna dair iyi bir fikrim var ama kanıt yok. kendinden cevap soruları politikası (bu _explicitly encouraged_, ve bunun için GUI seçenekleri bile var !!) onlara defalarca bağlantılı olduğunu ancak bunu kabul etmek gibi olamaz çünkü iki durumda da, onlar o kadar emmek gerekir. –

cevap

7
Hayır, C++ 11 biz taslak C++ 11 standart bölüm bakarsanız, varsayılan kurucuya sahip bir allocator gerektirmez

17.6.3.5[allocator.requirements] içerdiği Tablo 28Allocator gereksinimleri varsayılan yapıcısı için bir gereksinim içeren ve daha sonra ilgili bölümde en az bir yere uyum arayüz sağlanır:

[Örnek: aşağıdaki Tablo 28 gerekliliklerini yerine az bir arayüz destekleyen bir ayırıcı sınıfı şablon:

template <class Tp> 
struct SimpleAllocator { 
    typedef Tp value_type; 
    SimpleAllocator(ctor args); 

    template <class T> SimpleAllocator(const SimpleAllocator<T>& other); 

    Tp *allocate(std::size_t n); 
    void deallocate(Tp *p, std::size_t n); 
}; 

ucuna bağlı bir vaziyette, örneğin] varsayılan kurucu içermeyen

. basic_string assumes that allocators are default-constructible diyor: basic_string ait

boş dize optimizasyon ayırıcılarına varsayılan constructible varsayar

bir libstdc++ hata raporu vardır. Bu, C++ 98'de geçerli olsa da, şimdi durumunun durumuna sahip olması nedeniyleartık C++ 11'de doğru değildir. Ekli örnek programı göz önünde bulundurun.

g++ -std=c++11 -c t.cpp 

ile derleniyor ince derlemek gerekir halde bir hata mesajı üretir. sorunu, bulunmayan "_S_construct" çağrıları "_Alloc()" dır.

C++ 11 standardının varsayılan kurucular gerektirmediğini unutmayın. (Bölüm 17.6.3.5, Tablo 28). Özellikle, Bölüm 17.6.3.5'deki SimpleAllocator örneği aynı hatayı da tetikleyecektir.

ve tepki oldu:

Bu pek uygulanacak tek C++ 11 ayırıcısı yeni gereksinimlerin TÜM eksik std :: string, eksik gereksinimi ve olası değildir COW olmayan bir dize uygulamasına geçene kadar.

Bu

gcc 5.0 itibariyle sabittir: gcc 5 on wandbox

İlgili konular