2017-03-11 29 views
9

Teknik olarak, eşleşmemiş std::allocator uzmanlık alanı (kesinlikle, void için uzmanlık alanı dışında) STL kapsayıcıları için şablon parametresi olarak (hepsi değil, ancak aşağıda artı unordered_ (çok) harita /) set? Aşağıdaki kodu derler.bazı STL konteynerler için uyumsuz std :: allocator

#include <list> 
#include <forward_list> 
#include <deque> 
#include <set> 
#include <map> 

int main() 
{ 
    struct A { bool operator < (A) const { return true; } }; 
    struct B {}; 
    struct C {}; 
    std::list< A, std::allocator<C> > l; 
    std::forward_list< A, std::allocator<C> > fl; 
    std::deque< A, std::allocator<C> > d; 
    std::set< A, std::less<A>, std::allocator<C> > s; 
    std::multiset< A, std::less<A>, std::allocator<C> > ms; 
    std::map< A, B, std::less<A>, std::allocator<C> > m; 
    std::multimap< A, B, std::less<A>, std::allocator<C> > mm; 
} 

Bu ayırıcısı hemen olmanın kaynak tipine bağlı olmadan yatan düğüm tipine ribaund nedeniyle olduğuna inanıyoruz.

+0

Ben tanımsız davranış olabilir derdim ama bilmiyorum allocator zaten farklı türlerde aynıdır) –

cevap

10

bu bu örnekleri yani kabın value_type farklı value_type sahip bir ayırıcı belirten ihlal ettiği ayırıcısı ile uyumlu kap gereksinimleri (en azından C++ 11) UBdemek olur genel konteyner şartlarına uymaz. Ayrıca, C++ 11 standardında, allocator tiplerinin şablon parametresi olarak sağlanan tipten geri döneceğini söyleyen hiçbir şey bulamıyorum. olarak,

13) dizisi dışında bu maddede ve) 21.4 (tanımlanan kapların her bir ayırıcı ile uyumlu kabın ek gereklilikleri karşılar:


  1. Bölüm [container.requirements.general] söyler Tablo açıklanan

  2. Allocator farkında konteyner gereksinimleri 99.

diyor ki:

Gerektir: allocator_type::value_type, X::value_type ile aynıdır.

  1. Bölüm [default.allocator] ad std içinde allocator şablonun bir üyesi olarak

    typedef T value_type;

belirtir.

  4. Bölüm [multimap.overview] içerir:

template <class Key, class T, class Compare = less<Key>, 
    class Allocator = allocator<pair<const Key, T> > > 
class multimap { 
    [...] 
    typedef Allocator allocator_type; 
    [...] 
}; 

(diğer kapları benzer bulgularla.) Belki (

+0

Puan 1 + 2 yeterlidir. – Orient

+1

@orient: Hayır, 4. noktadaki yazım hatası, typedame std :: allocator_traits :: template rebind_alloc allocator_type; – Pixelchemist

+3

Ek bilgi: libC++ bir "static_assert" ile derleme zamanında bu UB'yi yakalar. –

İlgili konular