是否仍然可以自定义STL向量"参考"类型?

时间:2017-01-10 23:52:11

标签: c++11 reference stl allocator

是否可以自定义reference的{​​{1}}。 直到C ++ 11,似乎可以通过std::vector模板参数。 但不是了?

根据文档http://en.cppreference.com/w/cpp/container/vectorAllocator现在始终是reference,而value_type始终是模板参数value_type

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

有解决方法吗?

如果没有,是否意味着我必须专门化整个allocator_traits并且如果我想根据分配器拥有特殊的std::vector类型,可能会重现其所有功能?

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

注意:我知道pointer = T*争议。但是这更普遍,因为原则上我需要一个自定义std::vector<bool>来主要控制std::vector<RegularType, special_allocator<RegularType>>到特殊代理对象的返回类型。

具体实施:我正在研究GCC 6.3.1的stdlib源代码,在operator[](int)可以阅读:

std_vector.h

似乎表明仍然可以通过template<typename _Tp, ...> class vector : ...{ ... public: typedef typename _Alloc_traits::reference reference; }; allocator?)指定参考类型。

根据文档,_traitsallocator不需要allocator_traits类型。 另外,我还不知道如何定制这种类型。

GCC不遵守标准吗?或者只是间接reference被迫allocator_traits<Allocator>::reference

1 个答案:

答案 0 :(得分:3)

  

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

目的是阻止C ++无法提供的有前途的东西。

回到C ++ 98/03日,人们认为代理类型,专用引用等可以真正用于标准库容器和算法。当C ++ 11出现时,已经非常清楚......不,他们真的无法做到。或者至少,没有与实际语言参考相同的语义。

考虑到这种智慧,C ++ 11删除了许多这些不再合理的定制点。 typedef留在了,但主要是为了向后兼容性。

  

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

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