2015-03-26 7 views
9

Korzystanie z nieco zmodyfikowaną wersję Howard Hinnants's C++11 stack allocator która documented here i here z std::basic_string i zestawiania ze gcc który korzysta libstdc++, następujący przykład (see it live):Czy C++ 11 wymaga, aby alokatory były domyślnie skonstruowane, libstdC++ i libC++ nie zgadzały?

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); 

daje następujący błąd (m.in.):

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

Jednak działa bez błędu podczas kompilowania przy użyciu clang i używania libc++ ().

Implementacja stdlibc++ implementacji std::basic_string oczekuje, że przydzielający ma domyślny konstruktor.

Czy C++ 11 wymaga, aby podzielniki były domyślnie możliwe do skonstruowania? Która implementacja jest poprawna?

+2

pytania Samojezdne odpowiedział automatycznie otrzymasz zniżkę. Mam dobry pomysł, kto to jest, ale nie ma dowodów. Tak czy inaczej, muszą to wysysać, ponieważ polityka dotycząca pytań, na które można odpowiedzieć (jest nieodmiennie zachęcana) i są nawet dostępne opcje GUI !!) była z nimi powiązana wiele razy, ale nie mogą tego zaakceptować. –

Odpowiedz

7

Nie, C++ 11 nie wymaga przydzielania mieć domyślnego konstruktora, jeśli spojrzymy na projekcie C++ 11 część standardowa 17.6.3.5[allocator.requirements] to zawiera Tabela 28wymagania podzielnik który nie zawierają wymóg domyślnego konstruktora w dalszej części minimalny interfejs zgodny jest:

[Przykład: Poniżej przedstawiono szablon klasy podzielnik wspierania minimalną interfejs spełniającą wymagania podane w tablicy 28,

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); 
}; 

końcem przykład]

który nie zawiera domyślnego konstruktora.

Jest raport libstdc++ bug: basic_string assumes that allocators are default-constructible który mówi:

Pusty sznurek optymalizacja basic_string zakłada, że ​​podzielniki są domyślne constructible. Chociaż tak było w C++ 98, to nie jest już prawdziwe w C++ 11, ponieważ teraz alokatory mogą mieć stan .

Rozważ załączony przykładowy program. Kompilowanie z

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

wyświetla komunikat o błędzie, mimo że powinien skompilować dobrze. Problem to wywołania "_S_construct" "_Alloc()", które nie istnieje .

Należy zauważyć, że standard C++ 11 nie wymaga domyślnych konstruktorów. (Rozdział 17.6.3.5, Tabela 28). W szczególności przykład SimpleAllocator z sekcji 17.6.3.5 wywoła ten sam błąd.

a odpowiedź brzmiała:

To nie jest jedynym C++ 11 wymóg podzielnik brakuje std :: string, wszystkie nowe wymogi brakuje, i mało prawdopodobne, aby być realizowane dopóki nie przejdziemy do implementacji ciągów bez kodu COW.

ta jest ustalona na dzień gcc 5.0:

Poprawiono dla GCC 5 (przy użyciu nowego ciąg ABI)

Możemy to potwierdzić za pomocą gcc 5 on wandbox

Powiązane problemy