指向 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++ 则没有。我找不到任何错误报告或类似的讨论后者的选择。
这个代码
#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++ 则没有。我找不到任何错误报告或类似的讨论后者的选择。