You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何g++9不识别-std=c++20但CMake支持cxx_std_20?附后续问题

问题与解答

问题1:g++9不识别-std=c++20选项,但CMake支持cxx_std_20设置的原因?

同事编译项目时因调用C20新增的标准库方法报错,其使用的g版本为9.4.2。为验证问题,安装了g++-9(9.5.0)并将/usr/bin/g++软链指向它,却遇到以下矛盾情况:

  • 执行g++-9 -std=c++20时,报错提示无法识别该命令行选项;
  • 在CMakeLists.txt中使用target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_20)生成构建文件时无报错,但换成cxx_std_23则报错提示编译器不支持该特性。

解答

  • g++ 9系列发布时,C20标准尚未正式定稿,因此它仅支持使用预发布阶段的编译选项-std=c++2a来开启实验性的C20特性,而非正式的-std=c++20选项。
  • CMake的cxx_std_20是一个与编译器无关的抽象标准标识,它会根据当前使用的编译器自动映射为对应的实际编译参数。针对g9,CMake会自动将cxx_std_20转换为-std=c++2a,因此不会出现报错;而cxx_std_23对应的C23特性完全不在g++9的支持范围内,CMake会直接抛出不支持的错误。

问题2:g++9中std::stringstream::view不存在的原因?

编译项目时出现错误:error: ‘std::stringstream’ {aka ‘class std::__cxx11::basic_stringstream<char>’} has no member named ‘view’,已知view是C20新增接口,疑问是否g9的C++2a中尚未添加该接口?

解答

是的,g9配套的libstdc标准库并未实现std::basic_stringstream::view接口。该接口属于C20正式标准的内容,但g9作为较早的版本仅实现了C20的部分核心特性,这类较新的接口是在后续的g版本(如g11及以后)才被纳入libstdc中的。


内容的提问来源于stack exchange,提问作者Moritz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 00:45:37