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 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 Complete 16.0
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 Complete 16.0
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 Complete 16.0 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 Complete 16.0 spaceship
3427 operator<=>(const shared_ptr<T>&, nullptr_t) definition ill-formed November 2020 Complete 16.0 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