portability-std-allocator-const¶
报告使用 std::vector<const T>
(以及类似的包含 const 元素的容器)。这些在标准 C++ 中不允许,通常应该使用 std::vector<T>
代替。”
根据 C++ [allocator.requirements.general]
:“T 是任何 cv 无限定的对象类型”,std::allocator<const T>
是未定义的。许多标准容器默认使用 std::allocator
,因此它们的 const T
实例化是未定义的。
libc++ 将 std::allocator<const T>
定义为一个扩展,将在将来移除。
libstdc++ 和 MSVC 不支持 std::allocator<const T>
// libstdc++ has a better diagnostic since https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48101
std::deque<const int> deque; // error: static assertion failed: std::deque must have a non-const, non-volatile value_type
std::set<const int> set; // error: static assertion failed: std::set must have a non-const, non-volatile value_type
std::vector<int* const> vector; // error: static assertion failed: std::vector must have a non-const, non-volatile value_type
// MSVC
// error C2338: static_assert failed: 'The C++ Standard forbids containers of const elements because allocator<const T> is ill-formed.'
仅使用 libc++ 编译的代码库可能会累积这种未定义的用法。此检查找到此类代码并防止在清理进行时出现倒退。