C++ Standards Support in GCC

GCC supports different dialects of C++, corresponding to the multiple published ISO standards. Which standard it implements can be selected using the -std= command-line option.

For information about the status of C++ defect reports, please see this page.

For information about the status of the library implementation, please see the Implementation Status section of the Libstdc++ manual.

C++26 Support in GCC

GCC has experimental support for the next revision of the C++ standard, which is expected to be published in 2026.

C++26 Language Features

Language Feature Proposal Available in GCC? SD-6 Feature Test
Remove undefined behavior from lexing P2621R2 (DR) Yes
Making non-encodable string literals ill-formed P1854R4 (DR) 14
Unevaluated strings P2361R6 14
Add @, $, and ` to the basic character set P2558R2 No
constexpr cast from void* P2738R1 14 __cpp_constexpr >= 202306L
On the ignorability of standard attributes P2552R3 (DR) No
Static storage for braced initializers P2752R3 (DR) 14
User-generated static_assert messages P2741R3 14 __cpp_static_assert >= 202306L
Placeholder variables with no name P2169R4 14 __cpp_placeholder_variables >= 202306L
Pack indexing P2662R3 No __cpp_pack_indexing >= 202311L
Removing deprecated arithmetic conversion on enumerations P2864R2 (DR) 14
Template parameter initialization P2308R1 (DR) No

C++23 Support in GCC

GCC has experimental support for the next revision of the C++ standard, which is expected to be published in 2023.

C++23 features are available since GCC 11. To enable C++23 support, add the command-line parameter -std=c++2b to your g++ command line. Or, to enable GNU extensions in addition to C++23 features, add -std=gnu++2b.

Important: Because the ISO C++23 standard is still evolving, GCC's support is experimental. No attempt will be made to maintain backward compatibility with implementations of C++23 features that do not reflect the final standard.

C++23 Language Features

Language Feature Proposal Available in GCC? SD-6 Feature Test
Literal Suffix for (signed) size_t P0330R8 11 __cpp_size_t_suffix >= 202006L
Make () more optional for lambdas P1102R2 11
DR: Declarations and where to find them P1787R6 No
if consteval P1938R3 12 __cpp_if_consteval >= 202106L
C++ Identifier Syntax using Unicode Standard Annex 31 P1949R7 12
Allow Duplicate Attributes P2156R1 11
Narrowing contextual conversions to bool P1401R5 9
Trimming whitespaces before line splicing P2223R2 Yes
Mixed string literal concatenation P2201R1 Yes
Make declaration order layout mandated P1847R4 Yes
Removing Garbage Collection Support P2186R2 12
Simpler implicit move P2266R3 13 __cpp_implicit_move >= 202207L
Deducing this P0847R7 14 __cpp_explicit_this_parameter >= 202110L
CWG2586
Change scope of lambda trailing-return-type P2036R3 No
P2579R0
Multidimensional subscript operator P2128R6 12 __cpp_multidimensional_subscript >= 202110L
CWG2507 13
Non-literal variables (and labels and gotos) in constexpr functions P2242R3 12 __cpp_constexpr >= 202110L
Character encoding of diagnostic text P2246R1 No
Character sets and encodings P2314R4 10
Consistent character literal encoding P2316R2 Yes
Add support for preprocessing directives elifdef and elifndef P2334R1 12
Extend init-statement to allow alias-declaration P2360R0 12
auto(x): decay-copy in the language P0849R8 12
Labels at the end of compound statements P2324R1 13
CWG 2397: auto specifier for pointers and references to arrays CWG2397 12
CWG 2481: Cv-qualification of temporary to which a reference is bound CWG2481 Yes
Attributes on lambda-expressions P2173R1 9
A type trait to detect reference binding to temporary P2255R2 13
The Equality Operator You Are Looking For P2468R2 13
De-deprecating volatile compound operations P2327R1 13
Support for #warning P2437R1 Yes (extension)
13 (P2437R1)
Remove non-encodable wide character literals and multicharacter wide character literals P2362R3 13
Delimited escape sequences P2290R3 13
Named universal character escapes P2071R2 13 __cpp_named_character_escapes >= 202207L
Relaxing some constexpr restrictions P2448R2 13 __cpp_constexpr >= 202207L
Using unknown references in constant expressions P2280R4 14
static operator() P1169R4 13 __cpp_static_call_operator >= 202207L
Extended floating-point types and standard names P1467R9 13 __STDCPP_FLOAT16_T__
__STDCPP_FLOAT32_T__
__STDCPP_FLOAT64_T__
__STDCPP_FLOAT128_T__
__STDCPP_BFLOAT16_T__
Class template argument deduction from inherited constructors P2582R1 14
Portable assumptions P1774R8 13
Support for UTF-8 as a portable source file encoding P2295R6 13
char8_t Compatibility and Portability Fix P2513R3 13 __cpp_char8_t >= 202207L
Relax requirements on wchar_t to match existing practices P2460R2 Yes
Explicit lifetime management P2590R2 No
static operator[] P2589R1 13 __cpp_multidimensional_subscript >= 202211L
Permitting static constexpr variables in constexpr functions P2647R1 13 __cpp_constexpr >= 202211L
DR: consteval needs to propagate up P2564R3 14 __cpp_consteval >= 202211L
DR: Meaningful exports P2615R1 No
Wording for P2644R1 Fix for Range-based for Loop P2718R0 No __cpp_range_based_for >= 202211L

C++20 Support in GCC

GCC has experimental support for the latest revision of the C++ standard, which was published in 2020. The status of C++20 library features is described in the library documentation.

C++20 features are available since GCC 8. To enable C++20 support, add the command-line parameter -std=c++20 (use -std=c++2a in GCC 9 and earlier) to your g++ command line. Or, to enable GNU extensions in addition to C++20 features, add -std=gnu++20.

Important: Because the ISO C++20 standard is very recent, GCC's support is experimental.

C++20 Language Features

The following table lists new language features that have been accepted into the C++20 working draft. The "Proposal" column provides a link to the ISO C++ committee proposal that describes the feature, while the "Available in GCC?" column indicates the first version of GCC that contains an implementation of this feature (if it has been implemented).

Language Feature Proposal Available in GCC? SD-6 Feature Test
Default member initializers for bit-fields P0683R1 8
Fixing const-qualified pointers to members P0704R1 8
Allow lambda capture [=, this] P0409R2 8
__VA_OPT__ for preprocessor comma elision P0306R4
P1042R1
8 (partial, no #__VA_OPT__ support)
10 (partial, no placemarker token handling changes)
12
Designated initializers P0329R4 8 __cpp_designated_initializers >= 201707
Familiar template syntax for generic lambdas P0428R2 8 __cpp_generic_lambdas >= 201707
List deduction of vector P0702R1 8
Concepts P0734R0 10 __cpp_concepts >= 201907
P0857R0
P1084R2
P1141R2
P0848R3 __cpp_concepts >= 202002
P1616R1 __cpp_concepts >= 201907
P1452R2
P1972R0
P1980R0
P2092R0
P2103R0
P2113R0 10.2 (no reversed operator handling)
Range-based for statements with initializer P0614R1 9
Simplifying implicit lambda capture P0588R1 8
ADL and function templates that are not visible P0846R0 9
const mismatch with defaulted copy constructor P0641R2 9
Less eager instantiation of constexpr functions P0859R0 5.2 (mostly)
9 (P0859R0)
__cpp_constexpr_in_decltype >= 201711
Consistent comparison (operator<=>) P0515R3 10 __cpp_impl_three_way_comparison >= 201711
P0905R1
P1120R0
P1185R2
P1186R3 11
P1630R1 10
P1946R0
P1959R0
P2002R1 10.2
P2085R0
Access checking on specializations P0692R1 Yes
Default constructible and assignable stateless lambdas P0624R2 9
Lambdas in unevaluated contexts P0315R4 9
Language support for empty objects P0840R2 9
Relaxing the range-for loop customization point finding rules P0962R1 8
Allow structured bindings to accessible members P0969R0 8
Relaxing the structured bindings customization point finding rules P0961R1 8
Down with typename! P0634R3 9
Allow pack expansion in lambda init-capture P0780R2 9 __cpp_init_captures >= 201803
P2095R0 10
Proposed wording for likely and unlikely attributes P0479R5 9
Deprecate implicit capture of this via [=] P0806R2 9
Class Types in Non-Type Template Parameters P0732R2 9 __cpp_nontype_template_parameter_class >= 201806
Inconsistencies with non-type template parameters P1907R1 10 (no floating point, union, or subobject template args)
11 (complete)
__cpp_nontype_template_args >= 201911
Atomic Compare-and-Exchange with Padding Bits P0528R3 11 (compiler side only)
13 (full)
Efficient sized delete for variable sized classes P0722R3 9 __cpp_impl_destroying_delete >= 201806
Allowing Virtual Function Calls in Constant Expressions P1064R0 9
Prohibit aggregates with user-declared constructors P1008R1 9
explicit(bool) P0892R2 9 __cpp_conditional_explicit >= 201806
Signed integers are two's complement P1236R1 9
char8_t P0482R6 9 __cpp_char8_t >= 201811
Immediate functions (consteval) P1073R3 10 (no consteval virtual)
11 (full)
__cpp_consteval >= 201811
P1937R2 10
std::is_constant_evaluated P0595R2 9
Nested inline namespaces P1094R2 9
Relaxations of constexpr restrictions P1002R1 9
P1327R1 10
P1330R0 9 __cpp_constexpr >= 202002
P1331R2 10 __cpp_constexpr >= 201907
P1668R1 10
P0784R7 10 __cpp_constexpr_dynamic_alloc >= 201907
Feature test macros P0941R2 4.9 (__cpp_ macros)
5 (__has_cpp_attribute)
Modules P1103R3 11 (requires -fmodules-ts)
(No Private Module Fragment,
Parser-level Global Module Entity Merging,
Global Module Implications of extern "C/C++",
or Partition-specific Definition Visibility)
__cpp_modules >= 201810L
(Date of p1103r3)
P1766R1 No
P1811R0 11
P1703R1 (superceded by p1857) 11
P1874R1 11
P1979R0 11
P1779R3 11
P1857R3 11
P2115R0 11
P1815R2 No
Coroutines P0912R5 as applied to n4861 10 (requires -fcoroutines) __cpp_impl_coroutine >= 201902
Parenthesized initialization of aggregates P0960R3
10 __cpp_aggregate_paren_init >= 201902
P1975R0 11
DR: array size deduction in new-expression P1009R2 11
DR: Converting from T* to bool should be considered narrowing P1957R2 10 (C++20 mode only), 11 (all modes)
Stronger Unicode requirements P1041R4
P1139R2
10
Structured binding extensions P1091R3
P1381R1
10
8
Deprecate a[b,c] P1161R3 10
Deprecating some uses of volatile P1152R4 10
[[nodiscard("with reason")]] P1301R4 10
using enum P1099R5 11
Class template argument deduction for aggregates P1816R0 10 __cpp_deduction_guides >= 201907L
P2082R1 11
Class template argument deduction for alias templates P1814R0 10
Permit conversions to arrays of unknown bound P0388R4 10
constinit P1143R2 10 __cpp_constinit >= 201907
Layout-compatibility and Pointer-interconvertibility Traits P0466R5 12 (in library)
DR: Checking for abstract class types P0929R2 11
DR: More implicit moves (merge P0527R1 and P1155R3) P1825R0 11 (C++20 mode)
DR: Pseudo-destructors end object lifetimes P0593R6 11

C++17 Support in GCC

GCC has almost full support for the previous revision of the C++ standard, which was published in 2017. The status of C++17 library features is described in the library documentation.

C++17 mode is the default since GCC 11; it can be explicitly selected with the -std=c++17 command-line flag, or -std=gnu++17 to enable GNU extensions as well. Some C++17 features are available since GCC 5, but support was experimental and the ABI of C++17 features was not stable until GCC 9.

C++17 Language Features

The following table lists new language features that have been accepted into the C++17 working draft. The "Proposal" column provides a link to the ISO C++ committee proposal that describes the feature, while the "Available in GCC?" column indicates the first version of GCC that contains an implementation of this feature (if it has been implemented).

Language Feature Proposal Available in GCC? SD-6 Feature Test
Removing trigraphs N4086 5
u8 character literals N4267 6 __cpp_unicode_characters >= 201411
Folding expressions N4295 6 __cpp_fold_expressions >= 201411
Attributes for namespaces and enumerators N4266 4.9 (namespaces)
6 (enumerators)
__cpp_namespace_attributes >= 201411
__cpp_enumerator_attributes >= 201411
Nested namespace definitions N4230 6 __cpp_nested_namespace_definitions >= 201411
Allow constant evaluation for all non-type template arguments N4268 6 __cpp_nontype_template_args >= 201411
Extending static_assert N3928 6 __cpp_static_assert >= 201411
New Rules for auto deduction from braced-init-list N3922 5
Allow typename in a template template parameter N4051 5
[[fallthrough]] attribute P0188R1 7 __has_cpp_attribute(fallthrough)
[[nodiscard]] attribute P0189R1 4.8 ([[gnu::warn_unused_result]])
7 (P0189R1)
__has_cpp_attribute(nodiscard)
[[maybe_unused]] attribute P0212R1 4.8 ([[gnu::unused]])
7 (P0212R1)
__has_cpp_attribute(maybe_unused)
Extension to aggregate initialization P0017R1 7 __cpp_aggregate_bases >= 201603
Wording for constexpr lambda P0170R1 7 __cpp_constexpr >= 201603
Unary Folds and Empty Parameter Packs P0036R0 6 __cpp_fold_expressions >= 201603
Generalizing the Range-Based For Loop P0184R0 6 __cpp_range_based_for >= 201603
Lambda capture of *this by Value P0018R3 7 __cpp_capture_star_this >= 201603
Construction Rules for enum class variables P0138R2 7
Hexadecimal floating literals for C++ P0245R1 3.0 __cpp_hex_float >= 201603
Dynamic memory allocation for over-aligned data P0035R4 7 __cpp_aligned_new >= 201606
Guaranteed copy elision P0135R1 7 __cpp_guaranteed_copy_elision >= 201606
Refining Expression Evaluation Order for Idiomatic C++ P0145R3 7
constexpr if P0292R2 7 __cpp_if_constexpr >= 201606
Selection statements with initializer P0305R1 7
Template argument deduction for class templates P0091R3
P0512R0
7
8
__cpp_deduction_guides >= 201606
__cpp_deduction_guides >= 201611
Declaring non-type template parameters with auto P0127R2 7 __cpp_template_auto >= 201606
__cpp_nontype_template_parameter_auto >= 201606
Using attribute namespaces without repetition P0028R4 7
Ignoring unsupported non-standard attributes P0283R2 Yes
Structured bindings P0217R3 7 __cpp_structured_bindings >= 201606
Remove Deprecated Use of the register Keyword P0001R1 7
Remove Deprecated operator++(bool) P0002R1 7
Make exception specifications be part of the type system P0012R1 7 __cpp_noexcept_function_type >= 201510
__has_include for C++17 P0061R1 5
Rewording inheriting constructors (core issue 1941 et al) P0136R1 7 __cpp_inheriting_constructors >= 201511
Inline variables P0386R2 7 __cpp_inline_variables >= 201606
DR 150, Matching of template template arguments P0522R0 7 __cpp_template_template_args >= 201611
Removing dynamic exception specifications P0003R5 7
Pack expansions in using-declarations P0195R2 7 __cpp_variadic_using >= 201611
A byte type definition P0298R0 7

Technical Specifications

GCC also implements experimental support for some language Technical Specifications published by the C++ committee.

Important: Because these Technical Specifications are still evolving toward future inclusion in a C++ standard, GCC's support is experimental. No attempt will be made to maintain backward compatibility with implementations of features that do not reflect the final standard.

Technical Specification Document Available in GCC? Compiler Option SD-6 Feature Test
Concepts N4377 6 -fconcepts __cpp_concepts >= 201507
Transactional Memory N4514 6 (no atomic_cancel) -fgnu-tm __cpp_transactional_memory >= 201505
Coroutines N4649 10 -fcoroutines __cpp_impl_coroutine >= 201902L
Modules N4720 11 -fmodules-ts __cpp_modules >= 201810L

C++14 Support in GCC

GCC has full support for the 2014 C++ standard.

This mode is the default in GCC 6.1 up until GCC 10 (inclusive); it can be explicitly selected with the -std=c++14 command-line flag, or -std=gnu++14 to enable GNU extensions as well.

C++14 Language Features

The following table lists new language features that are part of the C++14 standard. The "Proposal" column provides a link to the ISO C++ committee proposal that describes the feature, while the "Available in GCC?" column indicates the first version of GCC that contains an implementation of this feature.

Language Feature Proposal Available in GCC? SD-6 Feature Test
Tweak to certain C++ contextual conversions N3323 4.9
Binary literals N3472 4.3 (GNU)
4.9 (N3472)
__cpp_binary_literals >= 201304
Return type deduction for normal functions N3638 4.8 (N3386)
4.9 (N3638)
__cpp_decltype_auto >= 201304
Generalized lambda capture (init-capture) N3648 4.5 (partial)
4.9 (N3648)
__cpp_init_captures >= 201304
Generic (polymorphic) lambda expressions N3649 4.9 __cpp_generic_lambdas >= 201304
Variable templates N3651 5 __cpp_variable_templates >= 201304
Relaxing requirements on constexpr functions N3652 5 __cpp_constexpr >= 201304
Member initializers and aggregates N3653 5 __cpp_aggregate_nsdmi >= 201304
Clarifying memory allocation N3664 N/A
Sized deallocation N3778 5 __cpp_sized_deallocation >= 201309
[[deprecated]] attribute N3760 4.9 (N3797) __has_cpp_attribute(deprecated) >= 201309
Single-quotation-mark as a digit separator N3781 4.9 (N3797) __cpp_digit_separator >= 201309

This feature was briefly part of the C++14 working paper, but was not part of the published standard; as a result, it has been removed from the compiler.

Language Feature Proposal Available in GCC? SD-6 Feature Test
Runtime-sized arrays with automatic storage duration
(Removed from the standard)
N3639 ?.? (GNU VLAs)
4.9 (N3639)
5 (GNU VLAs)
__cpp_runtime_arrays >= 198712

C++11 Support in GCC

GCC 4.8.1 was the first feature-complete implementation of the 2011 C++ standard, previously known as C++0x.

This mode can be selected with the -std=c++11 command-line flag, or -std=gnu++11 to enable GNU extensions as well.

For information about C++11 support in a specific version of GCC, please see:

Language Feature Proposal Available in GCC? SD-6 Feature Test
Rvalue references N2118 GCC 4.3 __cpp_rvalue_references >= 200610
    Rvalue references for *this N2439 GCC 4.8.1 __cpp_ref_qualifiers >= 200710
Initialization of class objects by rvalues N1610 Yes
Non-static data member initializers N2756 GCC 4.7 __cpp_nsdmi >= 200809
Variadic templates N2242 GCC 4.3 __cpp_variadic_templates >= 200704
    Extending variadic template template parameters N2555 GCC 4.4
Initializer lists N2672 GCC 4.4 __cpp_initializer_lists >= 200806
Static assertions N1720 GCC 4.3 __cpp_static_assert >= 200410
auto-typed variables N1984 GCC 4.4
    Multi-declarator auto N1737 GCC 4.4
    Removal of auto as a storage-class specifier N2546 GCC 4.4
    New function declarator syntax N2541 GCC 4.4
New wording for C++0x lambdas N2927 GCC 4.5 __cpp_lambdas >= 200907
Declared type of an expression N2343 GCC 4.3 __cpp_decltype >= 200707
    decltype and call expressions N3276 GCC 4.8.1
Right angle brackets N1757 GCC 4.3
Default template arguments for function templates DR226 GCC 4.3
Solving the SFINAE problem for expressions DR339 GCC 4.4
Template aliases N2258 GCC 4.7 __cpp_alias_templates >= 200704
Extern templates N1987 Yes
Null pointer constant N2431 GCC 4.6
Strongly-typed enums N2347 GCC 4.4
Forward declarations for enums N2764 GCC 4.6
Generalized attributes N2761 GCC 4.8 __cpp_attributes >= 200809;
__has_cpp_attribute(noreturn) >= 200809;
__has_cpp_attribute(carries_dependency) == 0 (not implemented)
Generalized constant expressions N2235 GCC 4.6 __cpp_constexpr >= 200704
Alignment support N2341 GCC 4.8
Delegating constructors N1986 GCC 4.7 __cpp_delegating_constructors >= 200604
Inheriting constructors N2540 GCC 4.8 __cpp_inheriting_constructors >= 200802
Explicit conversion operators N2437 GCC 4.5
New character types N2249 GCC 4.4 __cpp_unicode_characters >= 200704
Unicode string literals N2442 GCC 4.5 __cpp_unicode_literals >= 200710
Raw string literals N2442 GCC 4.5 __cpp_raw_strings >= 200710
Universal character name literals N2170 GCC 4.5
User-defined literals N2765 GCC 4.7 __cpp_user_defined_literals >= 200809
Standard Layout Types N2342 GCC 4.5
Defaulted and deleted functions N2346 GCC 4.4
Extended friend declarations N1791 GCC 4.7
Extending sizeof N2253 GCC 4.4
Inline namespaces N2535 GCC 4.4
Unrestricted unions N2544 GCC 4.6
Local and unnamed types as template arguments N2657 GCC 4.5
Range-based for N2930 GCC 4.6 __cpp_range_based_for >= 200907
Explicit virtual overrides N2928
N3206
N3272
GCC 4.7
Minimal support for garbage collection and reachability-based leak detection N2670 No
Allowing move constructors to throw [noexcept] N3050 GCC 4.6
Defining move special member functions N3053 GCC 4.6
Concurrency
Sequence points N2239 Yes
Atomic operations N2427 GCC 4.4
Strong Compare and Exchange N2748 GCC 4.5
Bidirectional Fences N2752 GCC 4.8
Memory model N2429 GCC 4.8
Data-dependency ordering: atomics and memory model N2664 GCC 4.4
(memory_order_consume)
Propagating exceptions N2179 GCC 4.4
Abandoning a process and at_quick_exit N2440 GCC 4.8
Allow atomics use in signal handlers N2547 Yes
Thread-local storage N2659 GCC 4.8
Dynamic initialization and destruction with concurrency N2660 GCC 4.3 __cpp_threadsafe_static_init >= 200806
C99 Features in C++11
__func__ predefined identifier N2340 GCC 4.3
C99 preprocessor N1653 GCC 4.3
long long N1811 GCC 4.3
Extended integral types N1988 Yes

C++98 Support in GCC

GCC has full support for the 1998 C++ standard as modified by the 2003 technical corrigendum and some later defect reports, excluding the export feature which was later removed from the language.

This mode is the default in GCC versions prior to 6.1; it can be explicitly selected with the -std=c++98 command-line flag, or -std=gnu++98 to enable GNU extensions as well.