某些STL容器的std :: allocator不匹配

时间:2017-03-11 14:01:30

标签: c++ stl containers language-lawyer allocator

使用不匹配的std::allocator特化(当然,除了void的专业化)作为STL容器的模板参数(不是所有这些,但下面列举的加上无序的(多个))在技术上是否有效图/集)?下面的代码编译得很好。

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

我认为这是因为分配器会立即反弹到底层节点类型而与其源类型没有任何关系。

1 个答案:

答案 0 :(得分:10)

我说这是 UB (至少在C ++ 11中),因为指定与容器的value_type具有不同value_type的分配器会违反分配器感知容器要求,这意味着这些实例不符合一般容器要求。此外,我在C ++ 11标准中找不到任何说明分配器类型将从作为模板参数提供的类型中反弹的内容。

1.第[container.requirements.general]节告诉我们:

  

13)本条款和(21.4)中定义的所有容器除阵列外,都满足分配器感知容器的附加要求,如表99所示。

2. 可识别分配器的容器要求表示:

  

要求:allocator_type::value_typeX::value_type相同。

  1. [default.allocator]部分指定
  2.   

    typedef T value_type;

    作为名称空间allocatorstd模板的成员。

    4.第[multimap.overview]节包含:

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

    (对其他容器也有类似的发现。)