Ce qui suit est avec sous Windows avec MinGW64, mais c'est la même logique sous Linux
Le but est de savoir quelles versions de C++ une version de gcc supporte et, pour une version donnée, quels sont les aspects de la norme qui sont effectivement supportés.
1/ Comparons la sortie de deux versions de gcc :
==== MinGW13 ========================================================
$ gcc.exe --version
gcc.exe (x86_64-posix-seh-rev1, Built by MinGW-Builds project) 13.1.0
$ gcc.exe -dM -E -x c++ - < /dev/null | grep cplus
#define __cplusplus 201703L
Par défaut gcc 13 se conforme à c++17.
$ gcc.exe -std=c++23 -dM -E -x c++ - < /dev/null | grep cplus
#define __cplusplus 202100L
on peut lui demander explicitement c++20 et c++23
$ gcc.exe -std=c++26 -dM -E -x c++ - < /dev/null | grep cplus
gcc.exe: error: unrecognized command-line option '-std=c++26'; did you mean '-std=c++20'?
mais pas le futur standard c++26.
==== MinGW14 =========================================================
$ gcc --version
gcc.exe (x86_64-posix-seh-rev2, Built by MinGW-Builds project) 14.2.0
$ gcc -dM -E -x c++ - < /dev/null | grep cplus
#define __cplusplus 201703L
Par défaut gcc 14, comme gcc 13, se conforme à c++17.
$ gcc -std=c++23 -dM -E -x c++ - < /dev/null | grep cplus
#define __cplusplus 202302L
Il supporte aussi c++20 et c++23
$ gcc -std=c++26 -dM -E -x c++ - < /dev/null | grep cplus
#define __cplusplus 202400L
et supporte partiellement c++26 avec la macro __cplusplus définit à '202400' !!
2/ Pour savoir quels aspects du langage c++ sont supportés par gcc il faut lui demander de lister tous les #define _cpp_xxxx qu'il génère. En les triant par ordre chronologique il est alors facile de voir les nouveautés:
$ gcc -std=c++23 -dM -E -x c++ - < /dev/null | grep __cpp | sort -k3
#define __cpp_runtime_arrays 198712L
#define __cpp_exceptions 199711L
#define __cpp_rtti 199711L
...
#define __cpp_consteval 202211L
#define __cpp_constexpr 202211L
#define __cpp_multidimensional_subscript 202211L
$ gcc -std=c++26 -dM -E -x c++ - < /dev/null | grep __cpp | sort -k3
#define __cpp_runtime_arrays 198712L
#define __cpp_exceptions 199711L
#define __cpp_rtti 199711L
...
#define __cpp_consteval 202211L
#define __cpp_multidimensional_subscript 202211L
#define __cpp_constexpr 202306L
#define __cpp_placeholder_variables 202306L
#define __cpp_static_assert 202306L
Avec ces commandes vous savez la version par défaut supportée par gcc, et vous savez le degré d’adhésion aux différents aspects du langage.
Pour savoir ce qui vous attend vous pouvez suivre au jour le jour le développement de gcc ici