std::views::values是否应支持std::map?C++20编译兼容性疑问
C++20中std::views::values遍历std::map的标准合规性
结论
使用std::views::values(m)遍历std::map的写法完全符合C++20标准,Clang 12/13/14的编译失败属于实现缺陷。
具体分析
std::map属于std::ranges::viewable_range的依据
C++20标准规定,只要类型满足std::ranges::range,并且以左值(或可移动临时对象)形式传递时,就属于viewable_range。std::map具备合法的迭代器与哨兵类型,完全满足range要求,作为左值传递给视图适配器时,完全符合viewable_range的判定条件,Clang旧版本的判定逻辑存在错误。std::views::values适配std::map的合法性std::views::values适配器的设计目标是从键值对类型的元素中提取值部分,仅要求元素类型支持值成员访问(比如拥有second成员,或可通过std::get<1>访问)。std::map的元素是std::pair<const Key, T>,完全满足该要求,标准并未限制该适配器只能用于特定容器。编译器实现差异原因
GCC 10+和MSVC 19.32+的实现正确遵循了C++20标准,而Clang 12-14版本在处理容器与视图适配器的适配逻辑时存在bug,该问题在Clang 15及后续版本中已被修复。
内容的提问来源于stack exchange,提问作者Jakob Stark
相关产品推荐
相关产品推荐

