指向 volatile 的指针的迭代器特征

Iterator traits on pointer to volatile

这个代码

#include <iterator>
#include <type_traits>

static_assert(std::is_same_v<typename std::iterator_traits<volatile int *>::value_type, volatile int>);

在最新的 GCC 和 clang 上编译,但在 MSVC 2019 上失败,这似乎删除了 volatile 限定符。参见 here on godbolt

const 已删除,因为 std::iterator_traits 用于 const T*T* 的标准专业化,但我认为应该保留 volatile

谁是对的?

编辑:我正在用 C++17 编译。

将@康桐薇的 link 评论扩展为一个答案:

这是LWG issue 2952。在其决议 value_type 之前是 volatile 资格,但其决议将其更改为删除 volatile 资格。

该决议已纳入 C++20,MSVC、GCC 和 Clang 似乎都以这种方式实现了它。 (意味着当编译器设置为 C++20 模式时,问题中的 static_assert 失败。)

关于该决议是否应作为标准先前修订的缺陷报告应用,您可以在此处阅读一些讨论:https://github.com/microsoft/STL/issues/2612

似乎 Microsoft 的标准库实现以及 LLVM 的 libc++ 也将问题解决应用于以前的标准修订模式,而 GCC 的 libstdc++ 则没有。我找不到任何错误报告或类似的讨论后者的选择。