You need to enable JavaScript to run this app. 使用std::views::keys的C++代码仅GCC可编译,标准规定的正确行为是怎样的?
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 17:27:01