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 | ||
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 | |||
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 | |||
3645 | resize_and_overwrite is overspecified to call its callback with lvalues |
Not voted in | Complete | 14.0 | |
3656 | Inconsistent bit operations returning a count | Not voted in | Complete | 15.0 | |