是否仍然可以自定义 STL 载体的"reference"类型?

Is it still possible to customize STL vector's "reference" type?

本文关键字:reference 类型 STL 自定义 是否      更新时间:2023-10-16

是否可以自定义std::vectorreference。在C++11之前,通过Allocator模板参数似乎是可能的。但现在不行了?

根据文献,http://en.cppreference.com/w/cpp/container/vector,reference现在总是value_type,而value_type总是模板参数T

即使使用CCD_ 8似乎也是不可能的,http://en.cppreference.com/w/cpp/memory/allocator_traits

有解决办法吗?

如果不是,这是否意味着如果我想拥有一个基于分配器的特殊reference类型,我必须专门化整个std::vector,并可能复制它的所有功能?

如果是这样的话,一般来说,所有这些约束的逻辑是什么?强制用户使用std::vector<T, A>始终管理常规内存(其中value_type = Treference = T&pointer = T*?)


注意:我知道std::vector<bool>的争议。然而,这有点笼统,因为原则上我需要一个自定义的std::vector<RegularType, special_allocator<RegularType>>,主要用于控制operator[](int)向特殊代理对象的返回类型。


具体实现:我正在查看GCC 6.3.1的stdlib源代码,在std_vector.h中可以读取:

template<typename _Tp, ...>
class vector : ...{
...
public:
typedef typename _Alloc_traits::reference          reference;
};

这似乎表明仍然可以通过CCD_ 19(_traits?)指定引用类型。

根据文档,allocatorallocator_traits不需要具有reference类型。另外,我不知道如何自定义这种类型。

GCC是否未遵守标准?或者只是间接地将allocator_traits<Allocator>::reference强制为allocator_traits<Allocator>::value_type&

如果是这样,那么一般来说,所有这些约束的逻辑是什么?

目的是停止承诺C++无法实现的东西。

早在C++98/03时代,人们就认为代理类型、专用引用等确实可以与标准库容器和算法一起使用。当C++11出现时,已经非常清楚。。。不,他们真的不能。或者至少,不具有与实际语言引用相同的语义。

考虑到这一点,C++11删除了许多不再合理的定制点。typedef保留了下来,但主要是为了向后兼容性。

这似乎表明仍然可以通过分配器(_traits?)指定引用类型。

不,不是。这是libstdc++中的一个错误;reference现在容器需要的value_type&allocator_traits没有reference自定义点。

相关文章: