C ++ 11是否要求分配器是默认可构造的,libstdc ++和libc ++是否不一致?

时间:2015-03-26 17:43:17

标签: c++ c++11 language-lawyer libstdc++ allocator

使用Howard Hinnants's C++11 stack allocator documented here的略微修改版本heresee it livestd::basic_string并使用gcc正在使用libstdc++ ,以下示例( see it live ):

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

给出以下错误():

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

然而,在使用clang并使用libc++ {{3}} )进行编译时,它可以正常运行。

stdlibc++的{​​{1}}实现期望分配器具有默认构造函数。

C ++ 11是否要求分配器是默认可构造的?哪种实现是正确的?

1 个答案:

答案 0 :(得分:9)

不,C ++ 11不需要分配器具有默认构造函数,如果我们查看草案C ++ 11标准部分17.6.3.5 [allocator.requirements] 它包含表28 分配器要求,它不包含对默认构造函数的要求,稍后在最小符合性接口部分中提供:

  

[示例:以下是支持。的分配器类模板   满足表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);
};
     

-end example]

,不包含默认构造函数。

有一个libstdc++错误报告:basic_string assumes that allocators are default-constructible说:

  

basic_string的空字符串优化假定分配器   是默认的可构造的。虽然这曾经是C ++ 98中的情况,但它   在C ++ 11中已不再适用,因为现在允许分配器具有   状态。

     

考虑附带的示例程序。使用

进行编译
g++ -std=c++11 -c t.cpp
     

生成错误消息,即使它应该编译正常。该   问题是“_S_construct”调用“_Alloc()”,但没有   存在。

     

请注意,C ++ 11标准不需要默认构造函数。   (第17.6.3.5节,表28)。特别是SimpleAllocator   第17.6.3.5节中的示例也会触发相同的错误。

并且回复是:

  

这不是唯一缺少的C ++ 11分配器要求   std :: string,缺少所有新要求,而且不太可能   实施,直到我们切换到非COW字符串实现。

gcc 5.0

起修复
  

已修复GCC 5(使用新字符串ABI时)

我们可以使用gcc 5 on wandbox

确认这一点