gpt4 book ai didi

c++ - 一些 STL 容器的 std::allocator 不匹配

转载 作者:可可西里 更新时间:2023-11-01 16:36:45 28 4
gpt4 key购买 nike

使用不匹配的 std::allocator 特化(当然,除了它对 void 的特化)作为 STL 容器(不是所有容器)的模板参数在技术上是否有效, 但下面列举的加上 unordered_(multi)map/set)?以下代码编译正常。

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

我相信这是由于分配器被立即反弹到底层节点类型而与其源类型没有任何关系。

最佳答案

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


1. [container.requirements.general] 部分告诉我们:

13) All of the containers defined in this Clause and in (21.4) except array meet the additional requirements of an allocator-aware container, as described in Table 99.

2. Allocator-aware container requirements 说:

Requires: allocator_type::value_type is the same as X::value_type.

  1. [default.allocator] 部分指定

typedef T value_type;

作为命名空间 stdallocator 模板的成员。

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;
[...]
};

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

关于c++ - 一些 STL 容器的 std::allocator 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42736112/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com