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 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    
P0849R8 LWG auto(x): DECAY_COPY in the language October 2021    
P1072R10 LWG basic_string::resize_and_overwrite October 2021    
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    
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

Library Working Group Issues Status

Issue # Issue Name Meeting Status First released version Labels
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 Complete 9.0  
3236 Random access iterator requirements lack limiting relational operators domain to comparing those from the same range November 2020     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      
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     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     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      
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     ranges
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     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     ranges
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     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     ranges
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     spaceship
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     ranges
3473 Normative encouragement in non-normative note November 2020     format
3474 Nesting join_views is broken because of CTAD November 2020     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     ranges
3483 transform_view::iterator’s difference is overconstrained November 2020     ranges
3391 Problems with counted_iterator/move_iterator::base() const & February 2021     ranges
3433 subrange::advance(n) has UB when n < 0 February 2021     ranges
3490 ranges::drop_while_view::begin() is missing a precondition February 2021     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      
3500 join_view::iterator::operator->() is bogus February 2021     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      
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     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     ranges
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     ranges
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 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      
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     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     format
3541 indirectly_readable_traits should be SFINAE-friendly for all types June 2021     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     ranges
3544 format-arg-store::args is unintentionally not exposition-only June 2021     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      
3549 view_interface is overspecified to derive from view_base June 2021     ranges
3551 borrowed_{iterator,subrange}_t are overspecified June 2021     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      
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      
3152 common_type and common_reference have flaws in common October 2021      
3293 move_iterator operator+() has incorrect constraints October 2021     ranges
3361 safe_range<SomeRange&> case October 2021     ranges
3392 ranges::distance() cannot be used on a move-only iterator with a sized sentinel October 2021     ranges
3407 Some problems with the wording changes of P1739R4 October 2021     ranges
3422 Issues of seed_seq’s constructors October 2021      
3470 convertible-to-non-slicing seems to reject valid case October 2021     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     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      
3559 Semantic requirements of sized_range is circular October 2021     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     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     ranges
3580 iota_view’s iterator’s binary operator+ should be improved October 2021     ranges
3581 The range constructor makes basic_string_view not trivially move constructible October 2021     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     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     ranges