libc++ C++2b Status

Overview

In November 2020, the C++ standard committee adopted the first changes to the next version of the C++ standard, known here as “C++2b” (probably to be C++23).

This page shows the status of libc++; the status of clang’s support of the language features is here.

Attention

Features in unreleased drafts of the standard are subject to change.

The groups that have contributed papers:

  • CWG - Core Language Working group

  • LWG - Library working group

  • SG1 - Study group #1 (Concurrency working group)

Note

“Nothing to do” means that no library changes were needed to implement this change.

Paper Status

Paper #

Group

Paper Name

Meeting

Status

First released version

P0881R7

LWG

A Proposal to add stacktrace library

Autumn 2020

P0943R6

LWG

Support C atomics in C++

Autumn 2020

Complete

15.0

P1048R1

LWG

A proposal for a type trait to detect scoped enumerations

Autumn 2020

Complete

12.0

P1679R3

LWG

string contains function

Autumn 2020

Complete

12.0

P1682R3

LWG

std::to_underlying for enumerations

February 2021

Complete

13.0

P2017R1

LWG

Conditionally borrowed ranges

February 2021

P2160R1

LWG

Locks lock lockables

February 2021

P2162R2

LWG

Inheriting from std::variant

February 2021

Complete

13.0

P2212R2

LWG

Relax Requirements for time_point::clock

February 2021

P2259R1

LWG

Repairing input range adaptors and counted_iterator

February 2021

P0401R6

LWG

Providing size feedback in the Allocator interface

June 2021

Complete

15.0

P0448R4

LWG

A strstream replacement using span<charT> as buffer

June 2021

P1132R8

LWG

out_ptr - a scalable output pointer abstraction

June 2021

P1328R1

LWG

Making std::type_info::operator== constexpr

June 2021

P1425R4

LWG

Iterators pair constructors for stack and queue

June 2021

Complete

14.0

P1518R2

LWG

Stop overconstraining allocators in container deduction guides

June 2021

Complete

13.0

P1659R3

LWG

starts_with and ends_with

June 2021

P1951R1

LWG

Default Arguments for pair Forwarding Constructor

June 2021

Complete

14.0

P1989R2

LWG

Range constructor for std::string_view

June 2021

Complete

14.0

P2136R3

LWG

invoke_r

June 2021

P2166R1

LWG

A Proposal to Prohibit std::basic_string and std::basic_string_view construction from nullptr

June 2021

Complete

13.0

P0288R9

LWG

any_invocable

October 2021

P0798R8

LWG

Monadic operations for std::optional

October 2021

Complete

14.0

P0849R8

LWG

auto(x): DECAY_COPY in the language

October 2021

Complete

14.0

P1072R10

LWG

basic_string::resize_and_overwrite

October 2021

Complete

14.0

P1147R1

LWG

Printing volatile Pointers

October 2021

Complete

14.0

P1272R4

LWG

Byteswapping for fun&&nuf

October 2021

Complete

14.0

P1675R2

LWG

rethrow_exception must be allowed to copy

October 2021

P2077R3

LWG

Heterogeneous erasure overloads for associative containers

October 2021

P2251R1

LWG

Require span & basic_string_view to be Trivially Copyable

October 2021

Complete

14.0

P2301R1

LWG

Add a pmr alias for std::stacktrace

October 2021

P2321R2

LWG

zip

October 2021

In Progress

P2340R1

LWG

Clarifying the status of the ‘C headers’

October 2021

P2393R1

LWG

Cleaning up integer-class types

October 2021

P2401R0

LWG

Add a conditional noexcept specification to std::exchange

October 2021

Complete

14.0

P0323R12

LWG

std::expected

February 2022

P0533R9

LWG

constexpr for <cmath> and <cstdlib>

February 2022

P0627R6

LWG

Function to mark unreachable code

February 2022

Complete

15.0

P1206R7

LWG

ranges::to: A function to convert any range to a container

February 2022

P1413R3

LWG

Deprecate std::aligned_storage and std::aligned_union

February 2022

P2255R3

LWG

A type trait to detect reference binding to temporary

February 2022

P2273R3

LWG

Making std::unique_ptr constexpr

February 2022

P2387R3

LWG

Pipe support for user-defined range adaptors

February 2022

P2440R1

LWG

ranges::iota, ranges::shift_left and ranges::shift_right

February 2022

P2441R2

LWG

views::join_view

February 2022

P2442R1

LWG

Windowing range adaptors: views::chunk and views::slide

February 2022

P2443R1

LWG

views::chunk_by

February 2022

P0009R18

LWG

mdspan: A Non-Owning Multidimensional Array Reference

July 2022

P0429R9

LWG

A Standard flat_map

July 2022

P1169R4

LWG

static operator()

July 2022

P1222R4

LWG

A Standard flat_set

July 2022

P1223R5

LWG

ranges::find_last(), ranges::find_last_if(), and ranges::find_last_if_not()

July 2022

P1467R9

LWG

Extended floating-point types and standard names

July 2022

P1642R11

LWG

Freestanding [utilities], [ranges], and [iterators]

July 2022

P1899R3

LWG

stride_view

July 2022

P2093R14

LWG

Formatted output

July 2022

P2165R4

LWG

Compatibility between tuple, pair and tuple-like objects

July 2022

P2278R4

LWG

cbegin should always return a constant iterator

July 2022

P2286R8

LWG

Formatting Ranges

July 2022

P2291R3

LWG

Add Constexpr Modifiers to Functions to_chars and from_chars for Integral Types in <charconv> Header

July 2022

P2302R4

LWG

std::ranges::contains

July 2022

P2322R6

LWG

ranges::fold

July 2022

P2374R4

LWG

views::cartesian_product

July 2022

P2404R3

LWG

Move-only types for equality_comparable_with, totally_ordered_with, and three_way_comparable_with

July 2022

P2408R5

LWG

Ranges iterators as inputs to non-Ranges algorithms

July 2022

P2417R2

LWG

A more constexpr bitset

July 2022

P2419R2

LWG

Clarify handling of encodings in localized formatting of chrono types

July 2022

P2438R2

LWG

std::string::substr() &&

July 2022

P2445R1

LWG

forward_like

July 2022

P2446R2

LWG

views::as_rvalue

July 2022

P2460R2

LWG

Relax requirements on wchar_t to match existing practices

July 2022

P2465R3

LWG

Standard Library Modules std and std.compat

July 2022

P2467R1

LWG

Support exclusive mode for fstreams

July 2022

P2474R2

LWG

views::repeat

July 2022

P2494R2

LWG

Relaxing range adaptors to allow for move only types

July 2022

P2499R0

LWG

string_view range constructor should be explicit

July 2022

P2502R2

LWG

std::generator: Synchronous Coroutine Generator for Ranges

July 2022

P2508R1

LWG

Exposing std::basic-format-string

July 2022

Complete

15.0

P2513R4

LWG

char8_t Compatibility and Portability Fixes

July 2022

P2517R1

LWG

Add a conditional noexcept specification to std::apply

July 2022

P2520R0

LWG

move_iterator should be a random access iterator

July 2022

P2540R1

LWG

Empty Product for certain Views

July 2022

P2549R1

LWG

std::unexpected should have error() as member accessor

July 2022

P2553R1

LWG

Make mdspan size_type controllable

July 2022

P2554R0

LWG

C-Array Interoperability of MDSpan

July 2022

P2585R0

LWG

Improving default container formatting

July 2022

P2590R2

LWG

Explicit lifetime management

July 2022

P2599R2

LWG

mdspan::size_type should be index_type

July 2022

P2604R0

LWG

mdspan: rename pointer and contiguous

July 2022

P2613R1

LWG

Add the missing empty to mdspan

July 2022

Library Working Group Issues Status

Issue #

Issue Name

Meeting

Status

First released version

Labels

2839

Self-move-assignment of library types, again

November 2020

Nothing To Do

3117

Missing packaged_task deduction guides

November 2020

3143

monotonic_buffer_resource growth policy is unclear

November 2020

3195

What is the stored pointer value of an empty weak_ptr?

November 2020

Nothing To Do

3211

std::tuple<> should be trivially constructible

November 2020

Complete

9.0

3236

Random access iterator requirements lack limiting relational operators domain to comparing those from the same range

November 2020

Nothing To Do

ranges

3265

move_iterator’s conversions are more broken after P1207

November 2020

Fixed by LWG3435

3435

three_way_comparable_with<reverse_iterator<int*>, reverse_iterator<const int*>>

November 2020

Complete

13.0

3432

Missing requirement for comparison_category

November 2020

spaceship

3447

Deduction guides for take_view and drop_view have different constraints

November 2020

Complete

14.0

3450

The const overloads of take_while_view::begin/end are underconstrained

November 2020

ranges

3464

istream::gcount() can overflow

November 2020

2731

Existence of lock_guard<MutexTypes...>::mutex_type typedef unclear

November 2020

Complete

5.0

2743

P0083R3 node_handle private members missing “exposition only” comment

November 2020

Nothing To Do

2820

Clarify <cstdint> macros

November 2020

Nothing To Do

3120

Unclear behavior of monotonic_buffer_resource::release()

November 2020

3170

is_always_equal added to std::allocator makes the standard library treat derived types as always equal

November 2020

3036

polymorphic_allocator::destroy is extraneous

November 2020

3171

LWG2989 breaks directory_entry stream insertion

November 2020

Complete

14.0

3306

ranges::advance violates its preconditions

November 2020

Complete

14.0

ranges

3403

Domain of ranges::ssize(E) doesn’t match ranges::size(E)

November 2020

ranges

3404

Finish removing subrange’s conversions from pair-like

November 2020

ranges

3405

common_view’s converting constructor is bad, too

November 2020

Complete

14.0

ranges

3406

elements_view::begin() and elements_view::end() have incompatible constraints

November 2020

ranges

3419

[algorithms.requirements]/15 doesn’t reserve as many rights as it intends to

November 2020

Nothing To Do

3420

cpp17-iterator should check that the type looks like an iterator first

November 2020

Complete

14.0

ranges

3421

Imperfect ADL emulation for boolean-testable

November 2020

Nothing To Do

ranges

3425

condition_variable_any fails to constrain its Lock parameters

November 2020

Nothing To Do

3426

operator<=>(const unique_ptr<T, D>&, nullptr_t) can’t get no satisfaction

November 2020

spaceship

3427

operator<=>(const shared_ptr<T>&, nullptr_t) definition ill-formed

November 2020

spaceship

3428

single_view’s in place constructor should be explicit

November 2020

Complete

14.0

ranges

3434

ios_base never reclaims memory for iarray and parray

November 2020

Nothing To Do

3437

__cpp_lib_polymorphic_allocator is in the wrong header

November 2020

Complete

14.0

3446

indirectly_readable_traits ambiguity for types with both value_type and element_type

November 2020

Complete

14.0

ranges

3448

transform_view’s sentinel<false> not comparable with iterator<true>

November 2020

ranges

3449

take_view and take_while_view’s sentinel<false> not comparable with their const iterator

November 2020

ranges

3453

Generic code cannot call ranges::advance(i, s)

November 2020

Nothing To Do

ranges

3455

Incorrect Postconditions on unique_ptr move assignment

November 2020

Nothing To Do

3460

Unimplementable noop_coroutine_handle guarantees

November 2020

Complete

14.0

3461

convertible_to’s description mishandles cv-qualified void

November 2020

Nothing To Do

3465

compare_partial_order_fallback requires F < E

November 2020

Complete

14.0

spaceship

3466

Specify the requirements for promise/future/shared_future consistently

November 2020

Nothing To Do

3467

bool can’t be an integer-like type

November 2020

Complete

14.0

3472

counted_iterator is missing preconditions

November 2020

Complete

14.0

ranges

3473

Normative encouragement in non-normative note

November 2020

Complete

15.0

format

3474

Nesting join_views is broken because of CTAD

November 2020

Complete

15.0

ranges

3476

thread and jthread constructors require that the parameters be move-constructible but never move construct the parameters

November 2020

3477

Simplify constraints for semiregular-box

November 2020

ranges

3482

drop_view’s const begin should additionally require sized_range

November 2020

Complete

14.0

ranges

3483

transform_view::iterator’s difference is overconstrained

November 2020

Complete

14.0

ranges

3391

Problems with counted_iterator/move_iterator::base() const &

February 2021

ranges

3433

subrange::advance(n) has UB when n < 0

February 2021

Complete

14.0

ranges

3490

ranges::drop_while_view::begin() is missing a precondition

February 2021

Nothing To Do

ranges

3492

Minimal improvements to elements_view::iterator

February 2021

ranges

3494

Allow ranges to be conditionally borrowed

February 2021

Superseded by P2017R1

ranges

3495

constexpr launder makes pointers to inactive members of unions usable

February 2021

Nothing To Do

3500

join_view::iterator::operator->() is bogus

February 2021

Complete

14.0

ranges

3502

elements_view should not be allowed to return dangling reference

February 2021

ranges

3505

split_view::outer-iterator::operator++ misspecified

February 2021

ranges

2774

std::function construction vs assignment

June 2021

2818

::std:: everywhere rule needs tweaking

June 2021

Nothing To Do

2997

LWG 491 and the specification of {forward_,}list::unique

June 2021

3410

lexicographical_compare_three_way is overspecified

June 2021

spaceship

3430

std::fstream & co. should be constructible from string_view

June 2021

3462

§[formatter.requirements]: Formatter requirements forbid use of fc.arg()

June 2021

format

3481

viewable_range mishandles lvalue move-only views

June 2021

Superseded by P2415R2

ranges

3506

Missing allocator-extended constructors for priority_queue

June 2021

Complete

14.0

3517

join_view::iterator’s iter_swap is underconstrained

June 2021

Complete

14.0

ranges

3518

Exception requirements on char trait operations unclear

June 2021

Nothing To Do

3519

Incomplete synopses for <random> classes

June 2021

3520

iter_move and iter_swap are inconsistent for transform_view::iterator

June 2021

Complete

14.0

ranges

3521

Overly strict requirements on qsort and bsearch

June 2021

Nothing To Do

3522

Missing requirement on InputIterator template parameter for priority_queue constructors

June 2021

Complete

14.0

ranges

3523

iota_view::sentinel is not always iota_view’s sentinel

June 2021

ranges

3526

Return types of uses_allocator_construction_args unspecified

June 2021

3527

uses_allocator_construction_args handles rvalue pairs of rvalue references incorrectly

June 2021

3528

make_from_tuple can perform (the equivalent of) a C-style cast

June 2021

3529

priority_queue(first, last) should construct c with (first, last)

June 2021

Complete

14.0

3530

BUILTIN-PTR-MEOW should not opt the type out of syntactic checks

June 2021

3532

split_view<V, P>::inner-iterator<true>::operator++(int) should depend on Base

June 2021

ranges

3533

Make base() const & consistent across iterator wrappers that supports input_iterators

June 2021

Complete

14.0

ranges

3536

Should chrono::from_stream() assign zero to duration for failure?

June 2021

chrono

3539

format_to must not copy models of output_iterator<const charT&>

June 2021

format

3540

§[format.arg] There should be no const in basic_format_arg(const T* p)

June 2021

Complete

14.0

format

3541

indirectly_readable_traits should be SFINAE-friendly for all types

June 2021

Complete

14.0

ranges

3542

basic_format_arg mishandles basic_string_view with custom traits

June 2021

Complete

14.0

format

3543

Definition of when counted_iterators refer to the same sequence isn’t quite right

June 2021

Nothing To Do

ranges

3544

format-arg-store::args is unintentionally not exposition-only

June 2021

Complete

14.0

format

3546

common_iterator’s postfix-proxy is not quite right

June 2021

ranges

3548

shared_ptr construction from unique_ptr should move (not copy) the deleter

June 2021

Complete

15.0

3549

view_interface is overspecified to derive from view_base

June 2021

Complete

14.0

ranges

3551

borrowed_{iterator,subrange}_t are overspecified

June 2021

Nothing To Do

ranges

3552

Parallel specialized memory algorithms should require forward iterators

June 2021

3553

Useless constraint in split_view::outer-iterator::value_type::begin()

June 2021

ranges

3555

{transform,elements}_view::iterator::iterator_concept should consider const-qualification of the underlying range

June 2021

ranges

2191

Incorrect specification of match_results(match_results&&)

October 2021

Nothing To Do

2381

Inconsistency in parsing floating point numbers

October 2021

2762

unique_ptr operator*() should be noexcept

October 2021

3121

tuple constructor constraints for UTypes&&... overloads

October 2021

3123

duration constructor from representation shouldn’t be effectively non-throwing

October 2021

chrono

3146

Excessive unwrapping in std::ref/cref

October 2021

Complete

14.0

3152

common_type and common_reference have flaws in common

October 2021

3293

move_iterator operator+() has incorrect constraints

October 2021

Complete

15.0

ranges

3361

safe_range<SomeRange&> case

October 2021

Nothing To Do

ranges

3392

ranges::distance() cannot be used on a move-only iterator with a sized sentinel

October 2021

Complete

14.0

ranges

3407

Some problems with the wording changes of P1739R4

October 2021

Complete

15.0

ranges

3422

Issues of seed_seq’s constructors

October 2021

Complete

14.0

3470

convertible-to-non-slicing seems to reject valid case

October 2021

Complete

14.0

ranges

3480

directory_iterator and recursive_directory_iterator are not C++20 ranges

October 2021

Complete

14.0

ranges

3498

Inconsistent noexcept-specifiers for basic_syncbuf

October 2021

3535

join_view::iterator::iterator_category and ::iterator_concept lie

October 2021

Complete

15.0

ranges

3554

chrono::parse needs const charT* and basic_string_view<charT> overloads

October 2021

chrono

3557

The static_cast expression in convertible_to has the wrong operand

October 2021

Complete

14.0

3559

Semantic requirements of sized_range is circular

October 2021

Nothing To Do

ranges

3560

ranges::equal and ranges::is_permutation should short-circuit for sized_ranges

October 2021

ranges

3561

Issue with internal counter in discard_block_engine

October 2021

3563

keys_view example is broken

October 2021

ranges

3566

Constraint recursion for operator<=>(optional<T>, U)

October 2021

spaceship

3567

Formatting move-only iterators take two

October 2021

format

3568

basic_istream_view needs to initialize value_

October 2021

ranges

3570

basic_osyncstream::emit should be an unformatted output function

October 2021

3571

flush_emit should set badbit if the emit call fails

October 2021

3572

copyable-box should be fully constexpr

October 2021

Complete

14.0

ranges

3573

Missing Throws element for basic_string_view(It begin, End end)

October 2021

Complete

14.0

3574

common_iterator should be completely constexpr-able

October 2021

Complete

14.0

ranges

3580

iota_view’s iterator’s binary operator+ should be improved

October 2021

Complete

14.0

ranges

3581

The range constructor makes basic_string_view not trivially move constructible

October 2021

Complete

14.0

ranges

3585

variant converting assignment with immovable alternative

October 2021

3589

The const lvalue reference overload of get for subrange does not constrain I to be copyable when N == 0

October 2021

Complete

14.0

ranges

3590

split_view::base() const & is overconstrained

October 2021

ranges

3591

lazy_split_view<input_view>::inner-iterator::base() && invalidates outer iterators

October 2021

ranges

3592

lazy_split_view needs to check the simpleness of Pattern

October 2021

ranges

3593

Several iterators’ base() const & and lazy_split_view::outer-iterator::value_type::end() missing noexcept

October 2021

ranges

3595

Exposition-only classes proxy and postfix-proxy for common_iterator should be fully constexpr

October 2021

Complete

14.0

ranges

3088

forward_list::merge behaviour unclear when passed *this

February 2022

3471

polymorphic_allocator::allocate does not satisfy Cpp17Allocator requirements

February 2022

3525

uses_allocator_construction_args fails to handle types convertible to pair

February 2022

3598

system_category().default_error_condition(0) is underspecified

February 2022

3601

common_iterator’s postfix-proxy needs indirectly_readable

February 2022

ranges

3607

contiguous_iterator should not be allowed to have custom iter_move and iter_swap behavior

February 2022

Nothing To Do

ranges

3610

iota_view::size sometimes rejects integer-class types

February 2022

ranges

3612

Inconsistent pointer alignment in std::format

February 2022

Complete

14.0

format

3616

LWG 3498 seems to miss the non-member swap for basic_syncbuf

February 2022

3618

Unnecessary iter_move for transform_view::iterator

February 2022

ranges

3619

Specification of vformat_to contains ill-formed formatted_size calls

February 2022

Nothing To Do

format

3621

Remove feature-test macro __cpp_lib_monadic_optional

February 2022

Complete

15.0

3632

unique_ptr “Mandates: This constructor is not selected by class template argument deduction”

February 2022

Nothing To Do

3643

Missing constexpr in std::counted_iterator

February 2022

3648

format should not print bool with 'c'

February 2022

Complete

15.0

format

3649

[fund.ts.v2] Reinstate and bump __cpp_lib_experimental_memory_resource feature test macro

February 2022

3650

Are std::basic_string ‘s iterator and const_iterator constexpr iterators?

February 2022

Nothing To Do

3654

basic_format_context::arg(size_t) should be noexcept

February 2022

Complete

15.0

format

3657

std::hash<std::filesystem::path> is not enabled

February 2022

3660

iterator_traits<common_iterator>::pointer should conform to §[iterator.traits]

February 2022

Complete

14.0

3661

constinit atomic<shared_ptr<T>> a(nullptr); should work

February 2022

3564

transform_view::iterator<true>::value_type and iterator_category should use const F&

July 2022

ranges

3617

function/packaged_task deduction guides and deducing this

July 2022

3656

Inconsistent bit operations returning a count

July 2022

Complete

15.0

3659

Consider ATOMIC_FLAG_INIT undeprecation

July 2022

Complete

15.0

3670

Cpp17InputIterators don’t have integer-class difference types

July 2022

ranges

3671

atomic_fetch_xor missing from stdatomic.h

July 2022

3672

common_iterator::operator->() should return by value

July 2022

ranges

3683

operator== for polymorphic_allocator cannot deduce template argument in common cases

July 2022

3687

expected<cv void, E> move constructor should move

July 2022

3692

zip_view::iterator’s operator<=> is overconstrained

July 2022

spaceship

3701

Make formatter<remove_cvref_t<const charT[N]>, charT> requirement explicit

July 2022

format

3702

Should zip_transform_view::iterator remove operator<

July 2022

3703

Missing requirements for expected<T, E> requires is_void<T>

July 2022

3704

LWG 2059 added overloads that might be ill-formed for sets

July 2022

3705

Hashability shouldn’t depend on basic_string’s allocator

July 2022

3707

chunk_view::outer-iterator::value_type::size should return unsigned type

July 2022

ranges

3708

take_while_view::sentinel’s conversion constructor should move

July 2022

ranges

3709

LWG-3703 was underly ambitious

July 2022

3710

The end of chunk_view for input ranges can be const

July 2022

ranges

3711

Missing preconditions for slide_view constructor

July 2022

ranges

3712

chunk_view and slide_view should not be default_initializable

July 2022

ranges

3713

Sorted with respect to comparator (only)

July 2022

3715

view_interface::empty is overconstrained

July 2022

3719

Directory iterators should be usable with default sentinel

July 2022

3721

Allow an arg-id with a value of zero for width in std-format-spec

July 2022

format

3724

decay-copy should be constrained

July 2022

Complete

14.0

3645

resize_and_overwrite is overspecified to call its callback with lvalues

Not voted in

Complete

14.0

3631

basic_format_arg(T&&) should use remove_cvref_t<T> throughout

Not voted in

Complete

15.0