C++ Standards Support in GCC#

Warning

The page was automatically converted by pandoc tool!

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++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

No

__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

No

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

No

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

No

__cpp_constexpr >= 202207L

Using unknown references in constant expressions

P2280R4

No

static operator()

P1169R4

13

__cpp_static_call_operator >= 202207L

Extended floating-point types and standard names

P1467R9

No

Class template argument deduction from inherited constructors

P2582R1

No

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

C++20 Support in GCC#

GCC has experimental support for the latest revision of the C++ standard, which was 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 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. 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

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 of the 2014 C++ standard.

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:

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.