Compiler support for C++17 - cppreference.com

From cppreference.com

* - hover over a cell marked with the star * to see additional pop-up notes.
DRnn - the number nn after "DR" denotes target C++ revision the Defect Report is applied to, e.g., DR20 → C++20.

C++17 core language features

C++17 featurePaper(s)GCC

Clang

MSVC

Apple Clang

EDG eccp

Intel C++

Nvidia HPC C++ (ex PGI)*

Nvidia nvcc

Cray

Embarcadero C++ Builder

IBM Open XL C++ for AIX

DR11: New

auto

rules for direct-list-initialization

N3922

5 3.8 19.0 (2015)*Yes 4.10.1 17.0 17.7 11.0 11.0 10.3 17.1.0 typename in a template template parameter

N4051

5 3.5 19.0 (2015)*Yes 4.10.1 17.0 17.7 Yes*11.0 10.3 17.1.0 Removing

trigraphs

N4086

5 3.5 16.0*Yes 5.0 19.1 11.0 11.0 10.3 17.1.0

Nested namespace

definition

N4230

6 3.6 19.0 (Update 3)*Yes 4.12 17.0 17.7 11.0 11.0 10.3 17.1.0

static_assert

with no message (

FTM

)*

N3928

6 2.5 19.10*Yes 4.12 18.0 17.7 11.0 11.0 10.3 17.1.0

Attributes

for namespaces and enumerators (

FTM

)* (

FTM

)*

N4266

4.9 (partial)*
6 3.6 19.0 (2015)*Yes 4.11 17.0 17.7 11.0 11.0 10.3 17.1.0

u8 character literals

N4267

6 3.6 19.0 (2015)*Yes 4.11 17.0 17.7 11.0 11.0 10.3 17.1.0 Allow constant evaluation for all constant template arguments (

FTM

)*

N4268

6 3.6 19.12*Yes 5.0 19.0.1 19.1 11.0 11.0 10.3 17.1.0

Unary fold expressions

and empty parameter packs

P0036R0

6 3.9 19.12*Yes 4.14 19.0 19.1 11.0 11.0 10.3 17.1.0 Remove deprecated use of the

register

keyword

P0001R1

7 3.8 19.11*Yes 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0 Remove deprecated operator++(bool)

P0002R1

7 3.8 19.11*Yes 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0 Make exception specifications part of the type system (

FTM

)*

P0012R1

7 4 19.12*Yes 4.14 19.0 19.1 11.0 11.0 10.3 17.1.0

__has_include

in preprocessor conditionals

P0061R1

5 Yes 19.11*Yes 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0 DR11: New specification for

inheriting constructors

(

DR1941

et al) (

FTM

)*

P0136R1

7 3.9 19.14**Yes 6.1 19.1 11.0 11.0 10.3 17.1.0

Aggregate classes

with base classes (

FTM

)*

P0017R1

7 3.9 19.14*Yes 5.0 19.0.1 19.1 11.0 11.0 10.3 17.1.0

Fold Expressions

(

FTM

)*

N4295

6 3.6 19.12*Yes 4.14 19.0 18.1 11.0 11.0 10.3 17.1.0 Lambda capture of *this (

FTM

)*

P0018R3

7 3.9 19.11*Yes 4.14 19.0 18.1 11.0 11.0 10.3 17.1.0 Direct-list-initialization of enumerations

P0138R2

7 3.9 19.11*Yes 4.14 18.0 19.1 11.0 11.0 10.3 17.1.0

constexpr lambda expressions

(

FTM

)*

P0170R1

7 5 19.11*Yes 4.14 19.0 18.1 11.0 11.0 10.3 17.1.0 Differing begin and end types in

range-based for

(

FTM

)*

P0184R0

6 3.9 19.10*Yes 4.12 18.0 17.7 11.0 11.0 10.3 17.1.0 [[

fallthrough

]]

attribute

P0188R1

7 3.9 19.10*Yes 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0 [[

nodiscard

]]

attribute

P0189R1

7 3.9 19.11*Yes 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0 [[

maybe_unused

]]

attribute

P0212R1

7 3.9 19.11*Yes 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0 Hexadecimal

floating-point literals

(

FTM

)*

P0245R1

3.0 Yes 19.11*Yes 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0 Using attribute namespaces without repetition

P0028R4

7 3.9 19.11*Yes 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0

Dynamic memory allocation

for over-aligned data (

FTM

)*

P0035R4

7 4 19.12*10.0.0*4.14 19.0 19.1 11.0 11.0 10.3 17.1.0 Constant template parameters with auto type (

FTM

)*

P0127R2

7 4 19.14*Yes 5.0 19.0.1 19.1 11.0 11.0 10.3 17.1.0 Guaranteed

copy elision

(

FTM

)*

P0135R1

7 4 19.13*Yes 5.0 19.0.1 19.1 11.0 11.0 10.3 17.1.0 Replacement of class objects containing reference members

P0137R1

7 6 19.14*Yes 5.0 19.1 11.0 11.0 10.3 17.1.0 Stricter

expression evaluation order

P0145R3

7 4 19.14*Yes 5.0 19.0.1 19.1 11.0 11.0 10.3 17.1.0

Structured Bindings

(

FTM

)*

P0217R3

7 4 19.11*Yes 4.14 19.0 18.1 11.0*11.0 10.3 17.1.0 Ignore unknown

attributes

P0283R2

Yes 3.9 19.0 (2015)*Yes 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0

constexpr if

statements (

FTM

)*

P0292R2

7 3.9 19.11*Yes 4.14 19.0 18.1 11.0 11.0 10.3 17.1.0 Init-statements for

if

and

switch

P0305R1

7 3.9 19.11*Yes 4.14 18.0 18.1 11.0 11.0 10.3 17.1.0

Inline variables

(

FTM

)*

P0386R2

7 3.9 19.12*Yes 4.14 19.0 18.1 11.0 11.0 10.3 17.1.0 Removing

dynamic exception specifications

P0003R5

7 4 19.12*Yes 4.14 19.0 19.1 11.0 11.0 10.3 17.1.0 Pack expansions in using-declarations (

FTM

)*

P0195R2

7 4 19.14*Yes 5.0 19.0 19.1 11.0 11.0 10.3 17.1.0 DR98: Matching of template template-arguments excludes compatible templates (

FTM

)*

P0522R0

7 4 19.12*Yes 5.0 19.0.1 19.1 11.0 11.0 10.3 17.1.0

Class template argument deduction

(

FTM

)*

P0091R3

7 5 19.14*Yes 5.0 19.0.1 19.1 11.0 11.0 10.3 17.1.0 C++17 feature

Paper(s)

GCC

Clang

MSVC

Apple Clang

EDG eccp

Intel C++

Nvidia HPC C++ (ex PGI)*

Nvidia nvcc

Cray

Embarcadero C++ Builder

IBM Open XL C++ for AIX

C++17 library features

C++17 featurePaper(s)GCC libstdc++

Clang libc++

MSVC STL

Apple Clang*

IBM Open XL C/C++ for AIX*

Intel Parallel STL

Embarcadero C++ Builder*

std::void_t

(

FTM

)*

N3911

6.1 3.6 19.0 (2015)*Yes 17.1.0 N/A10.3

std::uncaught_exceptions()

(

FTM

)*

N4259

6.1 3.7 19.0 (2015)*Yes 17.1.0 N/A10.3

std::size()

,

std::empty()

and

std::data()

(

FTM

)*

N4280

6 3.6 19.0 (2015)*Yes 17.1.0 N/A10.3 std::allocator_traits::is_always_equal, noexcept cleanups (

FTM

)*

N4258

6.1 3.7 19.0 (2015)*17.1.0 N/A

std::invoke

(

FTM

)*

N4169

6.1 3.7 19.0 (2015)*Yes 17.1.0 N/A

std::map::try_emplace

,

std::map::insert_or_assign

(

FTM

)*

N4279

6.1 3.7 19.0 (2015)*Yes 17.1.0 N/A

std::unordered_map::try_emplace

,

std::unordered_map::insert_or_assign

(

FTM

)*

N4279

6.1 3.7 19.0 (2015)*Yes 17.1.0 N/AImproving

std::pair

and

std::tuple

N4387

6.1 4 19.0 (Update 2)*Yes 17.1.0 N/A10.3

std::bool_constant

(

FTM

)*

N4389

6.1 3.7 19.0 (2015)*Yes 17.1.0 N/A10.3

std::shared_mutex

(untimed) (

FTM

)*

N4508

6 3.7 19.0 (Update 2)*Yes 17.1.0 N/A10.3 Minimal incomplete type support for

std::forward_list

,

std::list

, and

std::vector

(

FTM

)*

N4510

3.0 3.6 18.0*Yes 17.1.0 N/A

Type traits

variable templates (

FTM

)*

P0006R0

7.1 3.8 19.0 (Update 2)*Yes 17.1.0 N/A10.3

Logical operator type traits

(

FTM

)*

P0013R1

6.1 3.8 19.0 (Update 2)*Yes 17.1.0 N/A10.3

std::as_const

(

FTM

)*

P0007R1

7.1 3.8 19.0 (Update 2)*Yes 17.1.0 N/ARounding functions for

std::chrono::duration

and

std::chrono::time_point

(

FTM

)*

P0092R1

7.1 3.8 19.0 (Update 2)*Yes 17.1.0 N/ATransparent

std::owner_less

(std::owner_less<void>) (

FTM

)*

P0074R0

7.1 3.8 19.0 (Update 2)*Yes 17.1.0 N/A

std::not_fn

(

FTM

)*

P0005R4

P0358R1

7.1 3.9 19.12*Yes 17.1.0 N/A10.3 Parallel algorithms and

execution policies

(

FTM

)* (

FTM

)*

P0024R2

9*17
(partial)*19.14*18.0*

std::clamp()

(

FTM

)*

P0025R1

7 3.9 19.0 (Update 3)*10.0.0*17.1.0 N/A10.3

(nothrow-)swappable traits

(

FTM

)*

P0185R1

7.1*3.9 19.0 (Update 3)*10.0.0*17.1.0 N/A10.3

Polymorphic memory resources

(

FTM

)*

P0220R1

9.1 16 19.13*15.0.0*17.1.1 N/A10.3

std::apply

(

FTM

)*

P0220R1

7.1 16 19.13*Yes 17.1.0 N/A

Searchers

(

FTM

)*

P0220R1

7.1 16 19.13*Yes 17.1.0 N/A

std::sample

(

FTM

)*

P0220R1

7.1 16 19.13*Yes 17.1.0 N/A

Mathematical special functions

(

FTM

)*

P0226R1

7 19.14*17.1.1 N/A10.3 constexpr

std::addressof

(

FTM

)*

LWG2296

7.1 Yes 19.0 (Update 3)*17.1.0 N/Aconstexpr for

std::reverse_iterator

,

std::move_iterator

,

std::array

and range access (

FTM

)*

P0031R0

7.1 4 19.11*Yes 17.1.0 N/Aconstexprstd::atomic<T>::is_always_lock_free (

FTM

)*

P0152R1

7.1 3.9 19.11*Yes 17.1.0 N/A

std::enable_shared_from_this::weak_from_this

(

FTM

)*

P0033R1

7.1 3.9 19.12*Yes 17.1.0 N/A3-argument overload of

std::hypot

(

FTM

)*

P0030R1

7.1 3.9 19.14*Yes 17.1.0 N/A

std::byte

(

FTM

)*

P0298R3

7 5 19.11*Yes 17.1.1 N/A10.3

std::string_view

(

FTM

)*

N3921

P0220R1

P0254R2

P0403R1

7.1 4 19.10*(partial)*
19.11**10.0.0*17.1.0 N/A10.3

std::any

(

FTM

)*

P0220R1

P0032R3

7.1 4 19.10*10.0.0*17.1.0 N/A10.3

std::optional

(

FTM

)*

P0220R1

7.1 4 19.10*10.0.0*17.1.0 N/A10.3 Major portion of C11 standard library

P0063R3

9.1 7 19.0 (2015)*
(partial)*10.0.0*17.1.1 N/ASplicing

Maps

and

Sets

(

FTM

)*

P0083R3

7 8 19.12*10.0.0*17.1.1 N/Areturn type of

emplace

* functions of some

containers

changed from void to reference

P0084R2

7.1 4.0 19.11*Yes 17.1.0 N/A

std::variant

(

FTM

)*

P0088R3

7.1 4 19.10*10.0.0*17.1.0 N/A10.3

std::make_from_tuple()

(

FTM

)*

P0209R2

7.1 3.9 19.10*Yes 17.1.0 N/A10.3

std::has_unique_object_representations

(

FTM

)*

P0258R2

7.1 6 19.11*Yes 17.1.1 N/A10.3

std::gcd()

and

std::lcm()

(

FTM

)*

P0295R0

7 4 19.11*Yes 17.1.0 N/A10.3

CWG issue 1776

: Replacement of class objects containing reference members (

std::launder

) (

FTM

)*

P0137R1

7.1 6 19.14*Yes 17.1.0 N/A

Extending memory management tools

(

FTM

)*

P0040R3

7.1 4 (partial)*19.11*17.1.0 N/Ashared_ptr::weak_type (

FTM

)*

P0163R0

7.1 3.9 19.10*Yes 17.1.0 N/A

Elementary string conversions

: std::to_chars / std::from_chars (

FTM

)*

P0067R5

8*
11 7*
14*
20*19.14**
19.24*10.0.0**17.1.1*N/A10.3*

std::shared_ptr

and

std::weak_ptr

with array support

P0414R2

7 11 19.12*12.0.0*17.1.1 N/A10.3 Constexpr for all the member functions of

std::chrono::duration

and

std::chrono::time_point

(

FTM

)*

P0505R0

7.1 4 19.11*Yes 17.1.1 N/Astd::shared_ptr<T[]> (

FTM

)*

P0497R0

7.1 11 19.12*17.1.1 N/Aconstexpr

std::char_traits

(

FTM

)*

P0426R1

8.1 4 19.14*Yes 17.1.1 N/A

File system library

(std::filesystem) (

FTM

)*

P0218R1

P0219R1

8 7 19.14*11.0.0*17.1.1 N/A10.3

Hardware interference size

(

FTM

)*

P0154R1

12.1 15 (partial)*
19 19.11*N/A10.3

std::scoped_lock

(

FTM

)*

P0156R2

7 5 19.11*Yes 17.1.1 N/A10.3

std::is_aggregate

(

FTM

)*

LWG2911

7 5 19.15*Yes 17.1.1 N/A10.3 std::is_invocable,

std::invoke_result

(

FTM

)*

P0604R0

7.1 Yes 19.11*Yes 17.1.1 N/ADR17:

std::hash<std::filesystem::path>

LWG3657

11.4 17 19.32*N/A C++17 feature

Paper(s)

GCC libstdc++

Clang libc++

MSVC STL

Apple Clang*

IBM Open XL C/C++ for AIX*

Intel Parallel STL

Embarcadero C++ Builder*

NotesAs of 2020-11-20, the latest release of Oracle Developer Studio

is 12.6

. Its

documentation

does not mention C++17.

Cray compiler may have support for some features earlier than 11.0. That version is when it became a derivative of Clang, gaining all of the attendant language feature support of the base compiler. See

Cray/HPE document S-2179

.