采用以下代码段:
#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_allocator
:std::vector<const int, my_custom_allocator>
的格式是否正确?
答案 0 :(得分:4)
我认为它仍然会是错误的形式。根据{{3}},分配器应该与T
类型的对象一起使用,[allocator.requirements]
任何 cv -不合格的对象类型
基于此,在我看来,任何与const T
配合使用的东西都不能满足成为分配器的要求,因此不能用作标准容器的分配器……