C++标准发布时间表:从C++98到C++23,每个版本都带来了什么?

C++代码时,你有没有遇到过编译器报错说某个语法不支持?比如用了auto推导却提示‘not declared in this scope’,或者想用std::format结果发现GCC 11根本不认识?这往往不是你写错了,而是你的编译器默认没开对应C++标准——而标准的发布时间,就是一切的起点。

C++标准不是凭空来的,它有明确的发布年份

C++不像Python那样靠社区快速迭代,它的标准由ISO/IEC JTC1/SC22/WG21工作组制定,每几年才正式发布一版。每次发布都意味着新特性落地、旧行为修正、底层ABI可能变动。下面这张时间表,是开发者日常查文档、配编译选项、选工具链时最常翻的参考:

C++98 —— 1998年发布,第一个国际标准,奠定了std::vectorstd::string、模板、异常等基石;

C++03 —— 2003年发布,本质是C++98的技术勘误,无新增特性;

C++11 —— 2011年8月12日发布,革命性版本autolambdamove语义std::thread全来了;

C++14 —— 2014年12月15日发布,C++11的“补丁包”:泛型lambda、返回类型推导更宽松、std::make_unique加入;

C++17 —— 2017年12月21日发布,实用主义爆发:std::optionalstd::filesystem(需链接libstdc++fs)、结构化绑定、if-init语句;

C++20 —— 2020年12月15日发布,模块(Modules)、概念(Concepts)、协程(Coroutines)、std::format上线,但各大编译器支持度参差不齐;

C++23 —— 2023年11月10日正式发布,小步快跑:std::print(替代printf)、std::stacktrace、更严格的constexpr、范围库增强(如views::zip)。

怎么告诉编译器用哪个标准?

实际开发中,得手动指定。比如用g++编译一个C++20项目:

g++ -std=c++20 main.cpp -o main

Clang同理:

clang++ -std=c++20 main.cpp -o main

MSVC则在项目属性里设置「C++语言标准」为“ISO C++20 Standard”。别信IDE默认值——VS 2022新建项目仍默认C++14,Qt Creator新建C++项目默认C++11,不改就用不上新特性。

一个小提醒:发布时间 ≠ 编译器全面支持时间

C++20虽在2020年底发布,但GCC直到11.1(2021年4月)才初步支持Modules,且仅限实验模式;Clang 13(2021年10月)才开始稳定支持Concepts。所以看标准发布时间,更要查cppreference的编译器支持表。别光盯着年份,得盯具体特性在哪版编译器里真正能用。

顺手贴个检查当前编译器支持情况的小技巧:在代码里加一行

#if __cplusplus >= 202002L
    std::print("Hello from C++23!\n");
#endif

如果编译不过,说明要么没开-std=c++23,要么编译器太老——这时候回头看看标准发布时间表,心里就有底了。