# libc++ C++2a Status

In July 2017, the C++ standard committee created a draft for the next version of the C++ standard, known here as "C++2a" (probably to be C++20).

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

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

The groups that have contributed papers:

- LWG - Library working group
- CWG - Core Language Working group
- SG1 - Study group #1 (Concurrency working group)

### Paper Status

Paper # | Group | Paper Name | Meeting | Status | First released version
--- | --- | --- | --- | --- | ---
P0463R1 | LWG | Endian just Endian | Toronto | Complete | 7.0
P0674R1 | LWG | Extending make_shared to Support Arrays | Toronto |  |
P0020R6 | LWG | Floating Point Atomic | Albuquerque |  |
P0053R7 | LWG | C++ Synchronized Buffered Ostream | Albuquerque |  |
P0202R3 | LWG | Add constexpr modifiers to functions in <algorithm> and <utility> Headers | Albuquerque | In Progress | 7.0
P0415R1 | LWG | Constexpr for `std::complex` | Albuquerque | In Progress | 7.0
P0439R0 | LWG | Make `std::memory_order` a scoped enumeration | Albuquerque | Complete |
P0457R2 | LWG | String Prefix and Suffix Checking | Albuquerque | Complete | 6.0
P0550R2 | LWG | Transformation Trait `remove_cvref` | Albuquerque | Complete | 6.0
P0600R1 | LWG | nodiscard in the Library | Albuquerque | In Progress | 7.0
P0616R0 | LWG | de-pessimize legacy <numeric> algorithms with std::move | Albuquerque |  |
P0653R2 | LWG | Utility to convert a pointer to a raw pointer | Albuquerque | Complete | 6.0
P0718R2 | LWG | Atomic shared_ptr | Albuquerque |  |
P0767R1 | CWG | Deprecate POD | Albuquerque | Complete | 7.0
P0768R1 | CWG | Library Support for the Spaceship (Comparison) Operator | Albuquerque | Complete |
P0777R1 | LWG | Treating Unnecessary `decay` | Albuquerque | Complete | 7.0
P0122R7 | LWG | <span> | Jacksonville | Complete | 7.0
P0355R7 | LWG | Extending chrono to Calendars and Time Zones | Jacksonville | In progress |
P0551R3 | LWG | Thou Shalt Not Specialize `std` Function Templates! | Jacksonville | Complete | 11.0
P0753R2 | LWG | Manipulators for C++ Synchronized Buffered Ostream | Jacksonville |  |
P0754R2 | LWG | <version> | Jacksonville | Complete | 7.0
P0809R0 | LWG | Comparing Unordered Containers | Jacksonville |  |
P0858R0 | LWG | Constexpr iterator requirements | Jacksonville |  |
P0905R1 | CWG | Symmetry for spaceship | Jacksonville |  |
P0966R1 | LWG | `string::reserve` Should Not Shrink | Jacksonville | Complete | 8.0
P0019R8 | LWG | Atomic Ref | Rapperswil |  |
P0458R2 | LWG | Checking for Existence of an Element in Associative Containers | Rapperswil | Complete |
P0475R1 | LWG | LWG 2511: guaranteed copy elision for piecewise construction | Rapperswil |  |
P0476R2 | LWG | Bit-casting object representations | Rapperswil |  |
P0528R3 | CWG | The Curious Case of Padding Bits, Featuring Atomic Compare-and-Exchange | Rapperswil |  |
P0542R5 | CWG | Support for contract based programming in C++ | Rapperswil |  |
P0556R3 | LWG | Integral power-of-2 operations | Rapperswil | Complete | 9.0
P0619R4 | LWG | Reviewing Deprecated Facilities of C++17 for C++20 | Rapperswil | Partial (only std::allocator part is implemented) |
P0646R1 | LWG | Improving the Return Value of Erase-Like Algorithms | Rapperswil | Complete | 10.0
P0722R3 | CWG | Efficient sized delete for variable sized classes | Rapperswil | Complete | 9.0
P0758R1 | LWG | Implicit conversion traits and utility functions | Rapperswil | Complete |
P0759R1 | LWG | fpos Requirements | Rapperswil | Complete | 11.0
P0769R2 | LWG | Add shift to <algorithm> | Rapperswil |  |
P0788R3 | LWG | Standard Library Specification in a Concepts and Contracts World | Rapperswil |  |
P0879R0 | LWG | Constexpr for swap and swap related functions Also resolves LWG issue 2800. | Rapperswil |  |
P0887R1 | LWG | The identity metafunction | Rapperswil | Complete | 8.0
P0892R2 | CWG | explicit(bool) | Rapperswil |  |
P0898R3 | LWG | Standard Library Concepts | Rapperswil |  |
P0935R0 | LWG | Eradicating unnecessarily explicit default constructors from the standard library | Rapperswil |  |
P0941R2 | CWG | Integrating feature-test macros into the C++ WD | Rapperswil | In progress |
P1023R0 | LWG | constexpr comparison operators for std::array | Rapperswil | Complete | 8.0
P1025R1 | CWG | Update The Reference To The Unicode Standard | Rapperswil |  |
P1120R0 | CWG | Consistency improvements for <=> and other comparison operators | Rapperswil |  |
P0318R1 | LWG | unwrap_ref_decay and unwrap_reference | San Diego | Complete | 8.0
P0356R5 | LWG | Simplified partial function application | San Diego |  |
P0357R3 | LWG | reference_wrapper for incomplete types | San Diego | Complete | 8.0
P0482R6 | CWG | char8_t: A type for UTF-8 characters and strings | San Diego |  |
P0487R1 | LWG | Fixing operator>>(basic_istream&, CharT*) (LWG 2499) | San Diego | Complete | 8.0
P0591R4 | LWG | Utility functions to implement uses-allocator construction | San Diego |  |
P0595R2 | CWG | P0595R2 std::is_constant_evaluated() | San Diego | Complete | 9.0
P0602R4 | LWG | variant and optional should propagate copy/move triviality | San Diego | Complete | 8.0
P0608R3 | LWG | A sane variant converting constructor | San Diego | Complete | 9.0
P0655R1 | LWG | visit<R>: Explicit Return Type for visit | San Diego |  |
P0771R1 | LWG | std::function move constructor should be noexcept | San Diego | Complete | 6.0
P0896R4 | LWG | The One Ranges Proposal | San Diego |  |
P0899R1 | LWG | P0899R1 - LWG 3016 is not a defect | San Diego | Nothing to do |
P0919R3 | LWG | Heterogeneous lookup for unordered containers | San Diego |  |
P0972R0 | LWG | <chrono> `zero()`, `min()`, and `max()` should be noexcept | San Diego | Complete | 8.0
P1006R1 | LWG | Constexpr in std::pointer_traits | San Diego | Complete | 8.0
P1007R3 | LWG | `std::assume_aligned` | San Diego |  |
P1020R1 | LWG | Smart pointer creation with default initialization | San Diego |  |
P1032R1 | LWG | Misc constexpr bits | San Diego |  |
P1085R2 | LWG | Should Span be Regular? | San Diego | Complete | 8.0
P1123R0 | LWG | Editorial Guidance for merging P0019r8 and P0528r3 | San Diego |  |
P1148R0 | LWG | Cleaning up Clause 20 | San Diego |  |
P1165R1 | LWG | Make stateful allocator propagation more consistent for `operator+(basic_string)` | San Diego |  |
P1209R0 | LWG | Adopt Consistent Container Erasure from Library Fundamentals 2 for C++20 | San Diego | Complete | 8.0
P1210R0 | LWG | Completing the Rebase of Library Fundamentals, Version 3, Working Draft | San Diego |  |
P1236R1 | CWG | Alternative Wording for P0907R4 Signed Integers are Two's Complement | San Diego |  |
P1248R1 | LWG | Remove CommonReference requirement from StrictWeakOrdering (a.k.a Fixing Relations) | San Diego |  |
P1285R0 | LWG | Improving Completeness Requirements for Type Traits | San Diego |  |
P1353R0 | CWG | Missing feature test macros | San Diego |  |
P0339R6 | LWG | polymorphic_allocator<> as a vocabulary type | Kona |  |
P0340R3 | LWG | Making std::underlying_type SFINAE-friendly | Kona |  |
P0738R2 | LWG | I Stream, You Stream, We All Stream for istream_iterator | Kona |  |
P0811R3 | LWG | Well-behaved interpolation for numbers and pointers | Kona | Complete | 9.0
P0920R2 | LWG | Precalculated hash values in lookup | Kona | Reverted by P1661 |
P1001R2 | LWG | Target Vectorization Policies from Parallelism V2 TS to C++20 | Kona |  |
P1024R3 | LWG | Usability Enhancements for std::span | Kona | Complete | 9.0
P1164R1 | LWG | Make create_directory() Intuitive | Kona |  |
P1227R2 | LWG | Signed ssize() functions, unsigned size() functions | Kona | Complete | 9.0
P1252R2 | LWG | Ranges Design Cleanup | Kona |  |
P1286R2 | CWG | Contra CWG DR1778 | Kona |  |
P1357R1 | LWG | Traits for [Un]bounded Arrays | Kona | Complete | 9.0
P1458R1 | LWG | Mandating the Standard Library: Clause 16 - Language support library | Kona | Complete | 9.0
P1459R1 | LWG | Mandating the Standard Library: Clause 18 - Diagnostics library | Kona | Complete | 9.0
P1462R1 | LWG | Mandating the Standard Library: Clause 20 - Strings library | Kona | Complete | 9.0
P1463R1 | LWG | Mandating the Standard Library: Clause 21 - Containers library | Kona |  |
P1464R1 | LWG | Mandating the Standard Library: Clause 22 - Iterators library | Kona | Complete | 9.0
P0325 | LWG | to_array from LFTS with updates | Cologne | Complete | 10.0
P0408 | LWG | Efficient Access to basic_stringbuf ’s Buffer | Cologne |  |
P0466 | LWG | Layout-compatibility and Pointer-interconvertibility Traits | Cologne |  |
P0553 | LWG | Bit operations | Cologne | Complete | 9.0
P0631 | LWG | Math Constants | Cologne | Complete | 11.0
P0645 | LWG | Text Formatting | Cologne |  |
P0660 | LWG | Stop Token and Joining Thread, Rev 10 | Cologne |  |
P0784 | CWG | More constexpr containers | Cologne | Complete | 12.0
P0980 | LWG | Making std::string constexpr | Cologne |  |
P1004 | LWG | Making std::vector constexpr | Cologne |  |
P1035 | LWG | Input Range Adaptors | Cologne |  |
P1065 | LWG | Constexpr INVOKE | Cologne |  |
P1135 | LWG | The C++20 Synchronization Library | Cologne | Complete |
P1207 | LWG | Movability of Single-pass Iterators | Cologne |  |
P1208 | LWG | Adopt source_location for C++20 | Cologne |  |
P1355 | LWG | Exposing a narrow contract for ceil2 | Cologne | Complete | 9.0
P1361 | LWG | Integration of chrono with text formatting | Cologne |  |
P1423 | LWG | char8_t backward compatibility remediation | Cologne |  |
P1424 | LWG | 'constexpr' feature macro concerns | Cologne |  |
P1466 | LWG | Miscellaneous minor fixes for chrono | Cologne |  |
P1474 | LWG | Helpful pointers for ContiguousIterator | Cologne |  |
P1502 | LWG | Standard library header units for C++20 | Cologne |  |
P1522 | LWG | Iterator Difference Type and Integer Overflow | Cologne |  |
P1523 | LWG | Views and Size Types | Cologne |  |
P1612 | LWG | Relocate Endian’s Specification | Cologne | Complete | 10.0
P1614 | LWG | The Mothership has Landed | Cologne | In progress |
P1638 | LWG | basic_istream_view::iterator should not be copyable | Cologne |  |
P1643 | LWG | Add wait/notify to atomic_ref | Cologne |  |
P1644 | LWG | Add wait/notify to atomic<shared_ptr> | Cologne |  |
P1650 | LWG | Output std::chrono::days with 'd' suffix | Cologne |  |
P1651 | LWG | bind_front should not unwrap reference_wrapper | Cologne |  |
P1652 | LWG | Printf corner cases in std::format | Cologne |  |
P1661 | LWG | Remove dedicated precalculated hash lookup interface | Cologne | Nothing to do |
P1754 | LWG | Rename concepts to standard_case for C++20, while we still can | Cologne |  |
P0883 | LWG | Fixing Atomic Initialization | Belfast |  |
P1391 | LWG | Range constructor for std::string_view | Belfast |  |
P1394 | LWG | Range constructor for std::span | Belfast |  |
P1456 | LWG | Move-only views | Belfast |  |
P1622 | LWG | Mandating the Standard Library: Clause 32 - Thread support library | Belfast |  |
P1645 | LWG | constexpr for numeric algorithms | Belfast |  |
P1664 | LWG | reconstructible_range - a concept for putting ranges back together | Belfast |  |
P1686 | LWG | Mandating the Standard Library: Clause 27 - Time library | Belfast |  |
P1690 | LWG | Refinement Proposal for P0919 Heterogeneous lookup for unordered containers | Belfast |  |
P1716 | LWG | ranges compare algorithm are over-constrained | Belfast |  |
P1718 | LWG | Mandating the Standard Library: Clause 25 - Algorithms library | Belfast |  |
P1719 | LWG | Mandating the Standard Library: Clause 26 - Numerics library | Belfast |  |
P1720 | LWG | Mandating the Standard Library: Clause 28 - Localization library | Belfast |  |
P1721 | LWG | Mandating the Standard Library: Clause 29 - Input/Output library | Belfast |  |
P1722 | LWG | Mandating the Standard Library: Clause 30 - Regular Expression library | Belfast |  |
P1723 | LWG | Mandating the Standard Library: Clause 31 - Atomics library | Belfast |  |
P1855 | LWG | Make `<compare>` freestanding | Belfast |  |
P1862 | LWG | Ranges adaptors for non-copyable iterators | Belfast |  |
P1865 | LWG | Add max() to latch and barrier | Belfast |  |
P1869 | LWG | Rename 'condition_variable_any' interruptible wait methods | Belfast |  |
P1870 | LWG | forwarding-range is too subtle | Belfast |  |
P1871 | LWG | Should concepts be enabled or disabled? | Belfast |  |
P1872 | LWG | span should have size_type, not index_type | Belfast | Complete | 10.0
P1878 | LWG | Constraining Readable Types | Belfast |  |
P1892 | LWG | Extended locale-specific presentation specifiers for std::format | Belfast |  |
P1902 | LWG | Missing feature-test macros 2018-2019 | Belfast |  |
P1959 | LWG | Remove std::weak_equality and std::strong_equality | Belfast |  |
P1960 | LWG | NB Comment Changes Reviewed by SG1 | Belfast |  |
P1961 | LWG | Harmonizing the definitions of total order for pointers | Belfast |  |
P1965 | LWG | Blanket Wording for Specifying “Hidden Friends” | Belfast |  |
P0586 | LWG | Safe integral comparisons | Prague |  |
P0593 | CWG | Implicit creation of objects for low-level object manipulation | Prague |  |
P1115 | LWG | Improving the Return Value of Erase-Like Algorithms II: Free erase/erase if | Prague | Complete | 11.0
P1243 | LWG | Rangify New Algorithms | Prague |  |
P1460 | LWG | Mandating the Standard Library: Clause 20 - Utilities library | Prague |  |
P1739 | LWG | Avoid template bloat for safe_ranges in combination with "subrange-y" view adaptors | Prague |  |
P1831 | LWG | Deprecating volatile: library | Prague |  |
P1868 | LWG | width: clarifying units of width and precision in std::format | Prague |  |
P1908 | CWG | Reserving Attribute Namespaces for Future Use | Prague |  |
P1937 | CWG | Fixing inconsistencies between constexpr and consteval functions | Prague |  |
P1956 | LWG | On the names of low-level bit manipulation functions | Prague |  |
P1957 | CWG | Converting from T* to bool should be considered narrowing (re: US 212) | Prague |  |
P1963 | LWG | Fixing US 313 | Prague |  |
P1964 | LWG | Wording for boolean-testable | Prague |  |
P1970 | LWG | Consistency for size() functions: Add ranges::ssize | Prague |  |
P1973 | LWG | Rename "_default_init" Functions, Rev1 | Prague |  |
P1976 | LWG | Fixed-size span construction from dynamic range | Prague | Complete | 11.0
P1981 | LWG | Rename leap to leap_second | Prague |  |
P1982 | LWG | Rename link to time_zone_link | Prague |  |
P1983 | LWG | Wording for GB301, US296, US292, US291, and US283 | Prague |  |
P1994 | LWG | elements_view needs its own sentinel | Prague |  |
P2002 | CWG | Defaulted comparison specification cleanups | Prague |  |
P2045 | LWG | Missing Mandates for the standard library | Prague |  |
P2085 | CWG | Consistent defaulted comparisons | Prague |  |
P2091 | LWG | Issues with range access CPOs | Prague |  |
P2101 | LWG | 'Models' subsumes 'satisfies' (Wording for US298 and US300) | Prague |  |
P2102 | LWG | Make 'implicit expression variations' more explicit (Wording for US185) | Prague |  |
P2106 | LWG | Alternative wording for GB315 and GB316 | Prague |  |
P2116 | LWG | Remove tuple-like protocol support from fixed-extent span | Prague | Complete | 11.0

[ Note: "Nothing to do" means that no library changes were needed to implement this change -- end note]

The missing bits in P0600 are in [mem.res.class], [mem.poly.allocator.class], and [container.node.overview]

The missing bits in P0202 are in `copy` and `copy_backwards` (and the ones that call them: `copy_n`, `set_union`, `set_difference`, and `set_symmetric_difference`). This is because the first two algorithms have specializations that call `memmove` which is not constexpr. See Bug 25165

### Library Working group Issues Status

Issue # | Issue Name | Meeting | Status
--- | --- | --- | ---
2070 | `allocate_shared` should use `allocator_traits<A>::construct` | Toronto | Resolved by P0674R1
2444 | Inconsistent complexity for `std::sort_heap` | Toronto |
2593 | Moved-from state of Allocators | Toronto |
2597 | `std::log` misspecified for complex numbers | Toronto |
2783 | `stack::emplace()` and `queue::emplace()` should return `decltype(auto)` | Toronto | Complete
2932 | Constraints on parallel algorithm implementations are underspecified | Toronto |
2937 | Is `equivalent("existing_thing", "not_existing_thing")` an error | Toronto | Complete
2940 | `result_of` specification also needs a little cleanup | Toronto |
2942 | LWG 2873's resolution missed `weak_ptr::owner_before` | Toronto | Complete
2954 | Specialization of the convenience variable templates should be prohibited | Toronto | Complete
2961 | Bad postcondition for `set_default_resource` | Toronto |
2966 | Incomplete resolution of US 74 | Toronto | Nothing to do
2974 | Diagnose out of bounds `tuple_element/variant_alternative` | Toronto | Complete
2779 | [networking.ts] Relax requirements on buffer sequence iterators | Albuquerque |
2870 | Default value of parameter theta of polar should be dependent | Albuquerque | Complete
2935 | What should create_directories do when p already exists but is not a directory? | Albuquerque |
2941 | [thread.req.timing] wording should apply to both member and namespace-level functions | Albuquerque | Nothing to do
2944 | LWG 2905 accidentally removed requirement that construction of the deleter doesn't throw an exception | Albuquerque | Nothing to do
2945 | Order of template parameters in optional comparisons | Albuquerque | Complete
2948 | unique_ptr does not define operator<< for stream output | Albuquerque | Complete
2950 | std::byte operations are misspecified | Albuquerque | Complete
2952 | iterator_traits should work for pointers to cv T | Albuquerque | Complete
2953 | LWG 2853 should apply to deque::erase too | Albuquerque | Complete
2958 | Moves improperly defined as deleted | Albuquerque | We already do this
2964 | Apparently redundant requirement for dynamic_pointer_cast | Albuquerque |
2965 | Non-existing path::native_string() in filesystem_error::what() specification | Albuquerque | Nothing to do
2972 | What is is_trivially_destructible_v<int>? | Albuquerque | Complete
2976 | Dangling uses_allocator specialization for packaged_task | Albuquerque | Complete
2977 | unordered_meow::merge() has incorrect Throws: clause | Albuquerque | Nothing to do
2978 | Hash support for pmr::string and friends | Albuquerque |
2979 | aligned_union should require complete object types | Albuquerque | Complete
2980 | Cannot compare_exchange empty pointers | Albuquerque |
2981 | Remove redundant deduction guides from standard library | Albuquerque |
2982 | Making size_type consistent in associative container deduction guides | Albuquerque |
2988 | Clause 32 cleanup missed one typename | Albuquerque |
2993 | reference_wrapper<T> conversion from T&& | Albuquerque |
2998 | Requirements on function objects passed to {forward_,}list-specific algorithms | Albuquerque | Nothing to do
3001 | weak_ptr::element_type needs remove_extent_t | Albuquerque |
3024 | variant's copies must be deleted instead of disabled via SFINAE | Albuquerque | Complete
2164 | What are the semantics of `vector.emplace(vector.begin(), vector.back())`? | Jacksonville | Complete
2243 | `istream::putback` problem | Jacksonville | Complete
2816 | `resize_file` has impossible postcondition | Jacksonville | Nothing to do
2843 | Unclear behavior of `std::pmr::memory_resource::do_allocate()` | Jacksonville | Complete
2849 | Why does `!is_regular_file(from)` cause `copy_file` to report a "file already exists" error? | Jacksonville | Nothing to do
2851 | `std::filesystem` enum classes are now underspecified | Jacksonville | Nothing to do
2946 | LWG 2758's resolution missed further corrections | Jacksonville | Complete
2969 | `polymorphic_allocator::construct()` shouldn't pass `resource()` | Jacksonville | Complete
2975 | Missing case for `pair` construction in scoped and polymorphic allocators | Jacksonville |
2989 | `path`'s stream insertion operator lets you insert everything under the sun | Jacksonville | Completed
3000 | `monotonic_memory_resource::do_is_equal` uses `dynamic_cast` unnecessarily | Jacksonville |
3002 | [networking.ts] `basic_socket_acceptor::is_open()` isn't `noexcept` | Jacksonville |
3004 | §[string.capacity] and §[vector.capacity] should specify time complexity for `capacity()` | Jacksonville | Nothing to do
3005 | Destruction order of arrays by `make_shared/allocate_shared` only recommended? | Jacksonville |
3007 | `allocate_shared` should rebind allocator to cv-unqualified `value_type` for construction | Jacksonville |
3009 | Including `<string_view>` doesn't provide `std::size/empty/data` | Jacksonville | Complete
3010 | [networking.ts] `uses_executor` says "if a type `T::executor_type` exists" | Jacksonville |
3013 | `(recursive_)directory_iterator` construction and traversal should not be `noexcept` | Jacksonville | Complete
3014 | More `noexcept` issues with filesystem operations | Jacksonville | Complete
3015 | `copy_options::unspecified` underspecified | Jacksonville | Nothing to do
3017 | `list splice` functions should use `addressof` | Jacksonville | Complete
3020 | [networking.ts] Remove spurious nested `value_type` buffer sequence requirement | Jacksonville |
3026 | `filesystem::weakly_canonical` still defined in terms of `canonical(p, base)` | Jacksonville | Complete
3030 | Who shall meet the requirements of `try_lock`? | Jacksonville | Nothing to do
3034 | P0767R1 breaks previously-standard-layout types | Jacksonville | Complete
3035 | `std::allocator`'s constructors should be `constexpr` | Jacksonville | Complete
3039 | Unnecessary `decay` in `thread` and `packaged_task` | Jacksonville | Complete
3041 | Unnecessary `decay` in `reference_wrapper` | Jacksonville | Complete
3042 | `is_literal_type_v` should be inline | Jacksonville | Complete
3043 | Bogus postcondition for `filesystem_error` constructor | Jacksonville | Complete
3045 | `atomic<floating-point>` doesn't have `value_type` or `difference_type` | Jacksonville |
3048 | `transform_reduce(exec, first1, last1, first2, init)` discards execution policy | Jacksonville |
3051 | Floating point classifications were inadvertently changed in P0175 | Jacksonville | Nothing to do
3075 | `basic_string` needs deduction guides from `basic_string_view` | Jacksonville | Complete
2139 | What is a user-defined type? | Rapperswil |
2970 | Return type of std::visit misspecified | Rapperswil |
3058 | Parallel adjacent_difference shouldn't require creating temporaries | Rapperswil |
3062 | Unnecessary decay_t in is_execution_policy_v should be remove_cvref_t | Rapperswil |
3067 | recursive_directory_iterator::pop must invalidate | Rapperswil | Nothing to do
3071 | [networking.ts] read_until still refers to "input sequence" | Rapperswil | Nothing to do
3074 | Non-member functions for valarray should only deduce from the valarray | Rapperswil |
3076 | basic_string CTAD ambiguity | Rapperswil | Complete
3079 | LWG 2935 forgot to fix the existing_p overloads of create_directory | Rapperswil |
3080 | Floating point from_chars pattern specification breaks round-tripping | Rapperswil |
3083 | What should ios::iword(-1) do? | Rapperswil | Nothing to do
3094 | [time.duration.io]p4 makes surprising claims about encoding | Rapperswil |
3100 | Unnecessary and confusing "empty span" wording | Rapperswil | Nothing to do
3102 | Clarify span iterator and const_iterator behavior | Rapperswil | Complete
3104 | Fixing duration division | Rapperswil | Complete
2183 | Muddled allocator requirements for `match_results` constructors | San Diego | Complete
2184 | Muddled allocator requirements for `match_results` assignments | San Diego | Complete
2412 | `promise::set_value()` and `promise::get_future()` should not race | San Diego |
2499 | `operator>>(basic_istream&, CharT*)` makes it hard to avoid buffer overflows | San Diego | Resolved by P0487R1
2682 | `filesystem::copy()` won't create a symlink to a directory | San Diego | Nothing to do
2697 | [concurr.ts] Behavior of `future/shared_future` unwrapping constructor when given an invalid `future` | San Diego |
2797 | Trait precondition violations | San Diego | Resolved by 1285R0
2936 | Path comparison is defined in terms of the generic format | San Diego | Complete
2943 | Problematic specification of the wide version of `basic_filebuf::open` | San Diego | Nothing to do
2960 | [fund.ts.v3] `nonesuch` is insufficiently useless | San Diego | Complete
2995 | `basic_stringbuf` default constructor forbids it from using SSO capacity | San Diego |
2996 | Missing rvalue overloads for `shared_ptr` operations | San Diego |
3008 | `make_shared` (sub)object destruction semantics are not specified | San Diego |
3022 | `is_convertible<derived*, base*>` may lead to ODR | San Diego | Resolved by 1285R0
3025 | Map-like container deduction guides should use `pair<Key, T>`, not `pair<const Key, T>` | San Diego | Complete
3031 | Algorithms and predicates with non-const reference arguments | San Diego |
3037 | `polymorphic_allocator` and incomplete types | San Diego |
3038 | `polymorphic_allocator::allocate` should not allow integer overflow to create vulnerabilities | San Diego |
3054 | `uninitialized_copy` appears to not be able to meet its exception-safety guarantee | San Diego |
3065 | LWG 2989 missed that all `path`'s other operators should be hidden friends as well | San Diego | Complete
3096 | `path::lexically_relative` is confused by trailing slashes | San Diego | Complete
3116 | `OUTERMOST_ALLOC_TRAITS` needs `remove_reference_t` | San Diego |
3122 | `__cpp_lib_chrono_udls` was accidentally dropped | San Diego | Complete
3127 | `basic_osyncstream::rdbuf` needs a `const_cast` | San Diego |
3128 | `strstream::rdbuf` needs a `const_cast` | San Diego | Nothing to do
3129 | `regex_token_iterator` constructor uses wrong pointer arithmetic | San Diego |
3130 | §[input.output] needs many `addressof` | San Diego |
3131 | `addressof` all the things | San Diego |
3132 | Library needs to ban macros named `expects` or `ensures` | San Diego | Nothing to do
3134 | [fund.ts.v3] LFTSv3 contains extraneous [meta] variable templates that should have been deleted by P09961 | San Diego | Resolved by P1210R0
3137 | Header for `__cpp_lib_to_chars` | San Diego | Complete
3145 | `file_clock` breaks ABI for C++17 implementations | San Diego | Complete
3147 | Definitions of "likely" and "unlikely" are likely to cause problems | San Diego |
3148 | `<concepts>` should be freestanding | San Diego |
3153 | `Common` and `common_type` have too little in common | San Diego |
3154 | `Common` and `CommonReference` have a common defect | San Diego |
3012 | `atomic<T>` is unimplementable for non-`is_trivially_copy_constructible T` | Kona |
3040 | `basic_string_view::starts_with` Effects are incorrect | Kona | Complete
3077 | `(push|emplace)_back` should invalidate the `end` iterator | Kona | Nothing to do
3087 | One final `&x` in §[list.ops] | Kona | Nothing to do
3101 | `span`'s `Container` constructors need another constraint | Kona | Complete
3112 | `system_error` and `filesystem_error` constructors taking a `string` may not be able to meet their postconditions | Kona |
3119 | Program-definedness of closure types | Kona | Nothing to do
3133 | Modernizing numeric type requirements | Kona |
3144 | `span` does not have a `const_pointer` typedef | Kona | Complete
3173 | Enable CTAD for `ref-view` | Kona |
3179 | `subrange` should always model `Range` | Kona |
3180 | Inconsistently named return type for `ranges::minmax_element` | Kona |
3182 | Specification of `Same` could be clearer | Kona |
2899 | `is_(nothrow_)move_constructible` and `tuple`, `optional` and `unique_ptr` | Cologne | Complete
3055 | `path::operator+=(single-character)` misspecified | Cologne |
3158 | `tuple(allocator_arg_t, const Alloc&)` should be conditionally explicit | Cologne |
3169 | `ranges` permutation generators discard useful information | Cologne |
3183 | Normative permission to specialize Ranges variable templates | Cologne |
3184 | Inconsistencies in `bind_front` wording | Cologne |
3185 | Uses-allocator construction functions missing `constexpr` and `noexcept` | Cologne |
3186 | `ranges` removal, partition, and `partial_sort_copy` algorithms discard useful information | Cologne |
3187 | P0591R4 reverted DR 2586 fixes to `scoped_allocator_adaptor::construct()` | Cologne |
3191 | `std::ranges::shuffle` synopsis does not match algorithm definition | Cologne |
3196 | `std::optional<T>` is ill-formed is `T` is an array | Cologne | Complete
3198 | Bad constraint on `std::span::span()` | Cologne | Complete
3199 | `istream >> bitset<0>` fails | Cologne |
3202 | P0318R1 was supposed to be revised | Cologne | Complete
3206 | `year_month_day` conversion to `sys_days` uses not-existing member function | Cologne | Complete
3208 | `Boolean`'s expression requirements are ordered inconsistently | Cologne | Nothing to do
3209 | Expression in `year::ok()` returns clause is ill-formed | Cologne | Complete
3231 | `year_month_day_last::day` specification does not cover `!ok()` values | Belfast | Nothing to do
3225 | `zoned_time` converting constructor shall not be `noexcept` | Belfast |
3190 | `std::allocator::allocate` sometimes returns too little storage | Belfast |
3218 | Modifier for `%d` parse flag does not match POSIX and `format` specification | Belfast |
3224 | `zoned_time` constructor from `TimeZonePtr` does not specify initialization of `tp_` | Belfast |
3230 | Format specifier `%y/%Y` is missing locale alternative versions | Belfast |
3232 | Inconsistency in `zoned_time` deduction guides | Belfast |
3222 | P0574R1 introduced preconditions on non-existent parameters | Belfast |
3221 | Result of `year_month` arithmetic with `months` is ambiguous | Belfast |
3235 | `parse` manipulator without abbreviation is not callable | Belfast |
3246 | What are the constraints on the template parameter of `basic_format_arg`? | Belfast |
3253 | `basic_syncbuf::basic_syncbuf()` should not be explicit | Belfast |
3245 | Unnecessary restriction on `'%p'` parse specifier | Belfast |
3244 | Constraints for `Source` in §[fs.path.req] insufficiently constrainty | Belfast |
3241 | `chrono-spec` grammar ambiguity in §[time.format] | Belfast |
3257 | Missing feature testing macro update from P0858 | Belfast |
3256 | Feature testing macro for `constexpr` algorithms | Belfast |
3273 | Specify `weekday_indexed` to range of `[0, 7]` | Belfast |
3070 | `path::lexically_relative` causes surprising results if a filename can also be a root-name | Belfast |
3266 | `to_chars(bool)` should be deleted | Belfast |
3272 | `%I%p` should parse/format `duration` since midnight | Belfast |
3259 | The definition of constexpr iterators should be adjusted | Belfast |
3103 | Errors in taking subview of `span` should be ill-formed where possible | Belfast |
3274 | Missing feature test macro for `<span>` | Belfast |
3276 | Class `split_view::outer_iterator::value_type` should inherit from `view_interface` | Belfast |
3277 | Pre-increment on prvalues is not a requirement of `weakly_incrementable` | Belfast |
3149 | `DefaultConstructible` should require default initialization | Belfast |
-->
1203 | More useful rvalue stream insertion | Prague | 12.0
2859 | Definition of reachable in [ptr.launder] misses pointer arithmetic from pointer-interconvertible object | Prague |
3018 | `shared_ptr` of function type | Prague |
3050 | Conversion specification problem in `chrono::duration` constructor | Prague |
3141 | `CopyConstructible` doesn't preserve source values | Prague |
3150 | `UniformRandomBitGenerator` should validate `min` and `max` | Prague |
3175 | The `CommonReference` requirement of concept `SwappableWith` is not satisfied in the example | Prague |
3194 | `ConvertibleTo` prose does not match code | Prague |
3200 | `midpoint` should not constrain `T` is complete | Prague |
3201 | `lerp` should be marked as `noexcept` | Prague | Complete
3226 | `zoned_time` constructor from `string_view` should accept `zoned_time<Duration2, TimeZonePtr2>` | Prague |
3233 | Broken requirements for `shared_ptr` converting constructors | Prague |
3237 | LWG 3038 and 3190 have inconsistent PRs | Prague |
3238 | Insufficiently-defined behavior of `std::function` deduction guides | Prague |
3242 | `std::format`: missing rules for `arg-id` in `width` and `precision` | Prague |
3243 | `std::format` and negative zeroes | Prague |
3247 | `ranges::iter_move` should perform ADL-only lookup of `iter_move` | Prague |
3248 | `std::format` `#b`, `#B`, `#o`, `#x`, and `#X` presentation types misformat negative numbers | Prague |
3250 | `std::format`: `#` (alternate form) for NaN and inf | Prague |
3251 | Are `std::format` alignment specifiers applied to string arguments? | Prague |
3252 | Parse locale's aware modifiers for commands are not consistent with POSIX spec | Prague |
3254 | Strike `stop_token`'s `operator!=` | Prague |
3255 | `span`'s `array` constructor is too strict | Prague | Complete
3260 | `year_month*` arithmetic rejects durations convertible to years | Prague |
3262 | Formatting of negative durations is not specified | Prague |
3264 | `sized_range` and `ranges::size` redundantly use `disable_sized_range` | Prague |
3269 | Parse manipulators do not specify the result of the extraction from stream | Prague |
3270 | Parsing and formatting `%j` with `duration`s | Prague |
3280 | View converting constructors can cause constraint recursion and are unneeded | Prague |
3281 | Conversion from `pair-like` types to `subrange` is a silent semantic promotion | Prague |
3282 | `subrange` converting constructor should disallow derived to base conversions | Prague |
3284 | `random_access_iterator` semantic constraints accidentally promote difference type using unary negate | Prague |
3285 | The type of a customization point object shall satisfy `semiregular` | Prague |
3286 | `ranges::size` is not required to be valid after a call to `ranges::begin` on an input range | Prague |
3291 | `iota_view::iterator` has the wrong `iterator_category` | Prague |
3292 | `iota_view` is under-constrained | Prague |
3294 | `zoned_time` deduction guides misinterprets `string`/`char*` | Prague |
3296 | Inconsistent default argument for `basic_regex<>::assign` | Prague |
3299 | Pointers don't need customized iterator behavior | Prague |
3300 | Non-array `ssize` overload is underconstrained | Prague |
3301 | `transform_view::iterator` has incorrect `iterator_category` | Prague |
3302 | Range adaptor objects `keys` and `values` are unspecified | Prague |
3303 | Bad "`constexpr`" marker for `destroy/destroy_n` | Prague |
3304 | Allocate functions of `std::polymorphic_allocator` should require `[[nodiscard]]` | Prague |
3307 | `std::allocator<void>().allocate(n)` | Prague |
3310 | Replace `SIZE_MAX` with `numeric_limits<size_t>::max()` | Prague |
3313 | `join_view::iterator::operator--` is incorrectly constrained | Prague |
3314 | Is stream insertion behavior locale dependent when `Period::type` is `micro`? | Prague |
3315 | Correct Allocator Default Behavior | Prague |
3316 | Correctly define epoch for `utc_clock` / `utc_timepoint` | Prague |
3317 | Incorrect `operator<<` for floating-point durations | Prague |
3318 | Clarify whether clocks can represent time before their epoch | Prague |
3319 | Properly reference specification of IANA time zone database | Prague |
3320 | `span::cbegin/cend` methods produce different results than `std::[ranges::]cbegin/cend` | Prague | Complete
3321 | `uninitialized_construct_using_allocator` should use `construct_at` | Prague |
3323 | `has-tuple-element` helper concept needs `convertible_to` | Prague |
3324 | Special-case `std::strong/weak/partial_order` for pointers | Prague |
3325 | Constrain return type of transformation function for `transform_view` | Prague |
3326 | `enable_view` has false positives | Prague |
3327 | Format alignment specifiers vs. text direction | Prague |
3328 | Clarify that `std::string` is not good for UTF-8 | Prague |
3329 | `totally_ordered_with` both directly and indirectly requires `common_reference_with` | Prague |
3330 | Include `<compare>` from most library headers | Prague |
3331 | Define `totally_ordered/_with` in terms of `partially-ordered-with` | Prague |
3332 | Issue in §[time.format] | Prague |
3334 | `basic_osyncstream` move assignment and destruction calls `basic_syncbuf::emit()` twice | Prague |
3335 | Resolve C++20 NB comments US 273 and GB 274 | Prague |
3338 | Rename `default_constructible` to `default_initializable` | Prague |
3340 | Formatting functions should throw on argument/format string mismatch in §[format.functions] | Prague |
3346 | `pair` and `tuple` copy and move constructor have backwards specification | Prague |
3347 | `std::pair<T, U>` now requires `T` and `U` to be less-than-comparable | Prague |
3348 | `__cpp_lib_unwrap_ref` in wrong header | Prague |
3349 | Missing `__cpp_lib_constexpr_complex` for P0415R1 | Prague |
3350 | Simplify return type of `lexicographical_compare_three_way` | Prague |
3351 | `ranges::enable_safe_range` should not be constrained | Prague |
3352 | `strong_equality` isn't a thing | Prague |
3354 | `has_strong_structural_equality` has a meaningless definition | Prague |
3355 | The memory algorithms should support move-only input iterators introduced by P1207 | Prague |
3356 | `__cpp_lib_nothrow_convertible` should be `__cpp_lib_is_nothrow_convertible` | Prague |
3358 | §[span.cons] is mistaken that `to_address` can throw | Prague |
3359 | `<chrono>` leap second support should allow for negative leap seconds | Prague |
3360 | `three_way_comparable_with` is inconsistent with similar concepts | Prague |
3362 | Strike `stop_source`'s `operator!=` | Prague |
3363 | `drop_while_view` should opt-out of `sized_range` | Prague |
3364 | Initialize data members of ranges and their iterators | Prague |
3367 | Integer-class conversions should not throw | Prague |
3369 | `span`'s deduction-guide for built-in arrays doesn't work | Prague |
3371 | `visit_format_arg` and `make_format_args` are not hidden friends | Prague |
3372 | `vformat_to` should not try to deduce `Out` twice | Prague |
3373 | `{to,from}_chars_result` and `format_to_n_result` need the "we really mean what we say" wording | Prague |
3374 | P0653 + P1006 should have made the other `std::to_address` overload `constexpr` | Prague |
3375 | `decay` in `viewable_range` should be `remove_cvref` | Prague |
3377 | `elements_view::iterator` befriends a specialization of itself | Prague |
3379 | "`safe`" in several library names is misleading | Prague |
3380 | `common_type` and comparison categories | Prague |
3381 | `begin` and `data` must agree for `contiguous_range` | Prague |
3382 | NTTP for `pair` and `array` | Prague |
3383 | §[time.zone.leap.nonmembers] `sys_seconds` should be replaced with `seconds` | Prague |
3384 | `transform_view::sentinel` has an incorrect `operator-` | Prague |
3385 | `common_iterator` is not sufficiently constrained for non-copyable iterators | Prague |
3387 | §[range.reverse.view] `reverse_view<V>` unintentionally requires `range<const V>` | Prague |
3388 | `view` iterator types have ill-formed `<=>` operators | Prague |
3389 | A move-only iterator still does not have a `counted_iterator` | Prague |
3390 | `make_move_iterator()` cannot be used to construct a `move_iterator` for a move-only iterator | Prague |
3393 | Missing/incorrect feature test macro for coroutines | Prague |
3395 | Definition for three-way comparison needs to be updated (US 152) | Prague |
3396 | Clarify point of reference for `source_location::current()` (DE 169) | Prague |
3397 | `ranges::basic_istream_view::iterator` should not provide `iterator_category` | Prague |
3398 | `tuple_element_t` is also wrong for `const subrange` | Prague |

Last Updated: 16-Feb-2020