使用std::views::keys的C++代码仅GCC可编译,标准规定的正确行为是怎样的?
#include<array> #include<algorithm> #include<iostream> #include<map> #include<set> #include<ranges> constexpr std::array<std::pair<int, double>,2> arr{std::pair{1,1.1},std::pair{2,2.2}}; int main(){ auto it = std::ranges::find(arr | std::views::keys , 2); std::cout << *it; }
C++标准的强制规定
上述代码是完全符合C20及更高版本C标准要求的合法代码,符合标准规范的编译器实现必须支持编译运行该代码,程序运行后输出结果为2。相关标准要求明确如下:
std::views::keys是C++20引入的范围适配器,标准规定其可接收元素为类元组类型的输入范围,返回由每个元素第0个成员组成的视图。std::pair属于标准明确定义的类元组类型,适配逻辑完全合规。std::ranges::find要求输入范围满足input_range约束,且范围元素类型与待查找值满足equality_comparable_with约束。本例中arr | std::views::keys返回的视图元素类型为int,和待查找的整型字面量2完全满足相等比较约束,函数调用合法。
非GCC编译器编译失败的原因
仅GCC可正常编译的现象属于编译器/标准库版本或编译选项配置问题,和C++标准的强制要求无关:
- Clang编译失败:如果搭配GNU的libstdc使用,需要保证libstdc版本≥10、Clang版本≥12,且编译时显式指定
-std=c++20或更高版本的标准选项;如果搭配Clang自带的libc使用,则需要libc版本≥13才完整支持std::views::keys特性。 - MSVC编译失败:需要将MSVC编译器升级到19.29及以上版本,同时编译时显式指定
/std:c++20或更高版本的标准选项,旧版本MSVC对C++20 ranges的实现存在大量缺陷,无法支持该用法。
内容的提问来源于stack exchange,提问作者NoSenseEtAl
相关产品推荐
相关产品推荐

