C++ Standards Support in GCC

-std=

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++20 Support in GCC

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

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 still evolving, GCC's support is experimental. No attempt will be made to maintain backward compatibility with implementations of C++20 features that do not reflect the final standard.

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) 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 P1616R1 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 P1630R1 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 No (PR88101) 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 P1331R2 10 __cpp_constexpr >= 201907 P1668R1 10 P0784R7 10 Feature test macros P0941R2 4.9 ( __cpp_ macros)

5 ( __has_cpp_attribute ) Modules P1103R3 No (Modules Wiki) P1766R1 P1811R0 P1703R1 P1874R1 P1979R0 P1779R3 P1857R3 P2115R0 P1815R2 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 No (PR91367) 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 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 latest revision of the C++ standard, which was published in 2017. Some library features are missing or incomplete, as described in the library documentation.

C++17 features are available since GCC 5. This mode is the default in 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.

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 In progress Modules N4720 In progress

C++14 Support in GCC

GCC has full support for the previous revision of the C++ standard, which was published in 2014.

This mode is the default in GCC 6.1 up until GCC 10 (including); 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:

C++98 Support in GCC

export

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.