具有自定义分配器的const T STL容器格式不正确吗?

时间:2019-03-22 18:50:24

标签: c++ c++14 language-lawyer

采用以下代码段:

#include <vector>

std::vector<int> good;

//illegal, because std::allocator<const T> is ill-formed
std::vector<const int> bad;

//fails to compile under MSVS 2017
std::vector<const int, my_custom_allocator> X;

为什么X无法编译? MSVS 2017展示

  

错误C2338(失败的静态断言):C ++标准禁止容器const元素,因为分配器的格式不正确。

据我了解,这不一定正确。

根据20.5.3.5 [allocator.requirements](和many SO questions),const T的分配器格式不正确-但据我所知,它也有可能define an allocator that only works with a single type(表示非模板分配器)。尽管避免了语言上的限制,但这可以避免,尽管有些古怪。根据我的理解,由于模板是在编译时实例化的,因此永远不会实例化向量分配器的默认值(即std::allocator<const T>),因此,最后一行不会违反该规则。

忽略用例和替代方案(以及const std::vector<int>可能解决了您的问题的事实),并给出有效的my_custom_allocatorstd::vector<const int, my_custom_allocator>的格式是否正确?

1 个答案:

答案 0 :(得分:4)

我认为它仍然会是错误的形式。根据{{​​3}},分配器应该与T类型的对象一起使用,[allocator.requirements]

  

任何 cv -不合格的对象类型

基于此,在我看来,任何与const T配合使用的东西都不能满足成为分配器的要求,因此不能用作标准容器的分配器……