libc++ C++2b Status


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.


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)


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

Library Working Group Issues Status

Issue # Issue Name Meeting Status First released version
2839 Self-move-assignment of library types, again November 2020    
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    
3211 std::tuple<> should be trivially constructible November 2020    
3236 Random access iterator requirements lack limiting relational operators domain to comparing those from the same range November 2020    
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    
3447 Deduction guides for take_view and drop_view have different constraints November 2020    
3450 The const overloads of take_while_view::begin/end are underconstrained November 2020    
3464 istream::gcount() can overflow November 2020    
2731 Existence of lock_guard<MutexTypes...>::mutex_type typedef unclear November 2020    
2743 P0083R3 node_handle private members missing “exposition only” comment November 2020    
2820 Clarify <cstdint> macros November 2020    
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    
3306 ranges::advance violates its preconditions November 2020    
3403 Domain of ranges::ssize(E) doesn’t match ranges::size(E) November 2020    
3404 Finish removing subrange’s conversions from pair-like November 2020    
3405 common_view’s converting constructor is bad, too November 2020    
3406 elements_view::begin() and elements_view::end() have incompatible constraints November 2020    
3419 [algorithms.requirements]/15 doesn’t reserve as many rights as it intends to November 2020    
3420 cpp17-iterator should check that the type looks like an iterator first November 2020    
3421 Imperfect ADL emulation for boolean-testable November 2020    
3425 condition_variable_any fails to constrain its Lock parameters November 2020    
3426 operator<=>(const unique_ptr<T, D>&, nullptr_t) can’t get no satisfaction November 2020    
3427 operator<=>(const shared_ptr<T>&, nullptr_t) definition ill-formed November 2020    
3428 single_view’s in place constructor should be explicit November 2020    
3434 ios_base never reclaims memory for iarray and parray November 2020    
3437 __cpp_lib_polymorphic_allocator is in the wrong header November 2020    
3446 indirectly_readable_traits ambiguity for types with both value_type and element_type November 2020    
3448 transform_view’s sentinel<false> not comparable with iterator<true> November 2020    
3449 take_view and take_while_view’s sentinel<false> not comparable with their const iterator November 2020    
3453 Generic code cannot call ranges::advance(i, s) November 2020    
3455 Incorrect Postconditions on unique_ptr move assignment November 2020 Nothing To Do  
3460 Unimplementable noop_coroutine_handle guarantees November 2020    
3461 convertible_to’s description mishandles cv-qualified void November 2020    
3465 compare_partial_order_fallback requires F < E November 2020    
3466 Specify the requirements for promise/future/shared_future consistently November 2020    
3467 bool can’t be an integer-like type November 2020    
3472 counted_iterator is missing preconditions November 2020    
3473 Normative encouragement in non-normative note November 2020    
3474 Nesting join_views is broken because of CTAD November 2020    
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    
3482 drop_view’s const begin should additionally require sized_range November 2020    
3483 transform_view::iterator’s difference is overconstrained November 2020    
3391 Problems with counted_iterator/move_iterator::base() const & February 2021    
3433 subrange::advance(n) has UB when n < 0 February 2021    
3490 ranges::drop_while_view::begin() is missing a precondition February 2021    
3492 Minimal improvements to elements_view::iterator February 2021    
3494 Allow ranges to be conditionally borrowed February 2021 Superseded by P2017R1  
3495 constexpr launder makes pointers to inactive members of unions usable February 2021    
3500 join_view::iterator::operator->() is bogus February 2021    
3502 elements_view should not be allowed to return dangling reference February 2021    
3505 split_view::outer-iterator::operator++ misspecified February 2021    
2774 std::function construction vs assignment June 2021    
2818 ::std:: everywhere rule needs tweaking June 2021    
2997 LWG 491 and the specification of {forward_,}list::unique June 2021    
3410 lexicographical_compare_three_way is overspecified June 2021    
3430 std::fstream & co. should be constructible from string_view June 2021    
3462 §[formatter.requirements]: Formatter requirements forbid use of fc.arg() June 2021    
3481 viewable_range mishandles lvalue move-only views June 2021    
3506 Missing allocator-extended constructors for priority_queue June 2021 Complete 14.0
3517 join_view::iterator’s iter_swap is underconstrained June 2021    
3518 Exception requirements on char trait operations unclear June 2021    
3519 Incomplete synopses for <random> classes June 2021    
3520 iter_move and iter_swap are inconsistent for transform_view::iterator June 2021    
3521 Overly strict requirements on qsort and bsearch June 2021    
3522 Missing requirement on InputIterator template parameter for priority_queue constructors June 2021 Complete 14.0
3523 iota_view::sentinel is not always iota_view’s sentinel June 2021    
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    
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    
3533 Make base() const & consistent across iterator wrappers that supports input_iterators June 2021    
3536 Should chrono::from_stream() assign zero to duration for failure? June 2021    
3539 format_to must not copy models of output_iterator<const charT&> June 2021    
3540 §[format.arg] There should be no const in basic_format_arg(const T* p) June 2021    
3541 indirectly_readable_traits should be SFINAE-friendly for all types June 2021    
3542 basic_format_arg mishandles basic_string_view with custom traits June 2021    
3543 Definition of when counted_iterators refer to the same sequence isn’t quite right June 2021    
3544 format-arg-store::args is unintentionally not exposition-only June 2021    
3546 common_iterator’s postfix-proxy is not quite right June 2021    
3548 shared_ptr construction from unique_ptr should move (not copy) the deleter June 2021    
3549 view_interface is overspecified to derive from view_base June 2021    
3551 borrowed_{iterator,subrange}_t are overspecified June 2021    
3552 Parallel specialized memory algorithms should require forward iterators June 2021    
3553 Useless constraint in split_view::outer-iterator::value_type::begin() June 2021    
3555 {transform,elements}_view::iterator::iterator_concept should consider const-qualification of the underlying range June 2021