是否可以自定义reference
的{{1}}。
直到C ++ 11,似乎可以通过std::vector
模板参数。
但不是了?
根据文档http://en.cppreference.com/w/cpp/container/vector,Allocator
现在始终是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 = T
和reference = 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
?)指定参考类型。
根据文档,_traits
或allocator
不需要allocator_traits
类型。
另外,我还不知道如何定制这种类型。
GCC不遵守标准吗?或者只是间接reference
被迫allocator_traits<Allocator>::reference
?
答案 0 :(得分:3)
如果是这样,一般来说,所有这些约束的逻辑是什么?
目的是阻止C ++无法提供的有前途的东西。
回到C ++ 98/03日,人们认为代理类型,专用引用等可以真正用于标准库容器和算法。当C ++ 11出现时,已经非常清楚......不,他们真的无法做到。或者至少,没有与实际语言参考相同的语义。
考虑到这种智慧,C ++ 11删除了许多这些不再合理的定制点。 typedef留在了,但主要是为了向后兼容性。
这似乎表明仍然可以通过分配器指定引用类型(_traits?)。
不,不是。这是libstdc ++中的一个错误;现在,reference
必需为容器value_type&
。 allocator_traits
没有reference
自定义点。