为何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
相关产品推荐
相关产品推荐

