GCC 7.3是否包含全部C++17特性?编译C++17项目报错原因是什么
核心问题结论
GCC 7.3并不支持全部C++17特性,出现编译报错的原因如下:
- GCC 7.x对C17的支持属于实验性阶段,该版本发布时C17标准刚刚定稿,标准库实现尚未补全,编译器通过
-std=c++1z参数标识实验性的C++17特性支持,而非正式的-std=c++17参数。 - 两个报错对应的特性均未在GCC 7.3中实现:
std::reduce是C++17新增的<numeric>头组件,GCC直到8.1版本才完成该特性的实现std::to_chars_result是C++17新增的<charconv>头的配套类型,GCC 7.x完全没有实现<charconv>相关功能,该组件直到GCC 8.1才提供初始支持,浮点类型的to_chars实现更是到GCC 11才完成
- Windows环境可正常编译的原因:Windows下通常使用MSVC编译器,MSVC对C++17特性的落地进度早于GCC早期版本,VS 2017的后续更新版本就已经完整实现了上述两个特性,因此不会出现编译错误。
可行解决方案
- 优先升级GCC版本到8.1及以上,推荐使用GCC 9及更高版本,可覆盖绝大多数常用C17特性,升级后CMake会自动识别编译器的正式C17支持,使用
-std=c++17参数编译。 - 若暂时无法升级GCC版本,可以对缺失特性做兼容处理:使用
std::accumulate替代std::reduce的基础功能,使用std::to_string或第三方格式化库替代std::to_chars相关功能。
内容的提问来源于stack exchange,提问作者Nadav Sagie
相关产品推荐
相关产品推荐

