使用Howard Hinnants's C++11 stack allocator documented here的略微修改版本here和see it live,std::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是否要求分配器是默认可构造的?哪种实现是正确的?
答案 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
确认这一点