-std=是唯一可靠指定c++标准的方式,不加时g++默认可能用c++98或gnu++14(依gcc版本而定),行为不可控;必须显式写如-std=c++11,且需置于源文件后、-o前,否则可能被忽略。

-std= 是唯一可靠的方式,不加这个参数时 g++ 默认可能用 c++98 或 gnu++14(取决于 GCC 版本),行为不可控。
必须显式写 -std=c++11 及以上版本
GCC 不会自动“升级”标准;哪怕你用的是 GCC 14,不指定 -std 仍可能降级到旧标准。常见错误是只写 g++ main.cpp -o app,结果 auto、std::make_unique 等特性直接报错。
-
-std=c++11:基础现代特性支持,兼容性最广 -
-std=c++14:增加泛型 lambda、二进制字面量等 -
-std=c++17:结构化绑定、std::optional、if constexpr -
-std=c++20:概念(concepts)、协程、std::format(需 GCC ≥13) -
-std=gnu++17:在c++17基础上启用 GNU 扩展(如 nested functions),但降低可移植性
-std 必须放在源文件和输出选项之间
顺序错会导致参数被忽略或误解析。比如 g++ -o app -std=c++20 main.cpp 在某些旧版 GCC 中可能失效;正确写法是:
g++ main.cpp -std=c++20 -o app
原因:GCC 按从左到右顺序解析参数,部分选项(如 -o)会“消费”紧随其后的 token,把 -std= 放后面更安全。
- 错误示例:
g++ -std=c++20 -o app main.cpp—— 大多数情况能工作,但非所有 GCC 版本都严格保证 - 推荐写法:
g++ main.cpp -std=c++20 -Wall -Werror -o app - 如果用了
-c分步编译,每个g++ -c命令都得带-std=
检查当前 GCC 实际支持哪些 C++ 标准
不是所有 GCC 版本都支持 c++23 或 c++26;运行以下命令可确认:
g++ --version
然后查对应版本的官方文档,或直接试编译一个最小 concept 示例:
echo "template<typename t> concept Integral = std::is_integral_v<t>;" | g++ -x c++ -std=c++20 -c -</t></typename>
若报错 unrecognized command line option '-std=c++20',说明 GCC 太老;若报 concept 相关 error,则说明标准支持但语法有误。
- GCC 8 支持
c++2a(即早期c++20) - GCC 11 起完整支持
c++20 - GCC 13 开始实验性支持
c++23(需-std=c++23) -
-std=后缀不接受大小写混写,必须小写,如c++20,不能写C++20
最容易被忽略的一点:CMake 或 Makefile 里如果写了 set(CMAKE_CXX_STANDARD 17),它底层仍是生成 -std=c++17 参数;但如果你手动调用 g++ 却没加,就完全绕过了这个配置——命令行参数永远优先于构建系统默认值。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











