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

Sha*_*our 10 c++ libstdc++ allocator language-lawyer c++11

使用稍加修改的版本霍华德Hinnants的C++ 11堆栈分配这是记录在这里,并在这里,与std::basic_string和编译与gcc被使用libstdc++,下面的例子(见直播):

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);
Run Code Online (Sandbox Code Playgroud)

出现以下错误(以及其他错误):

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

但是在编译clang和使用时它可以正常工作libc++(请参见实时).

stdlibc++实施std::basic_string预计分配器有一个默认的构造函数.

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

Sha*_*our 9

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

[示例:以下是支持满足表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);
};
Run Code Online (Sandbox Code Playgroud)

- 末端的例子]

它不包含默认构造函数.

有一个libstdc++错误报告:basic_string假定分配器是默认构造的,它说:

basic_string的空字符串优化假定分配器是默认可构造的.虽然在C++ 98中曾经是这种情况,但在C++ 11中已经不再如此,因为现在分配器可以拥有状态.

考虑附带的示例程序.用.编译

g++ -std=c++11 -c t.cpp
Run Code Online (Sandbox Code Playgroud)

产生错误消息,即使它应该编译正常.问题是"_S_construct"调用"_Alloc()",它不存在.

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

而回应是:

这不是std :: string中缺少的唯一C++ 11分配器要求,缺少所有新要求,并且在我们切换到非COW字符串实现之前不太可能实现.

这是固定的gcc 5.0:

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

我们可以在wandbox上使用gcc 5来确认这一点