# 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 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 |  |
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 |  |
P0646R1 | LWG | Improving the Return Value of Erase-Like Algorithms | Rapperswil |  |
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 |  |
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 |  |
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

[ 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`, `copy_backwards`, `move`, and `move_backwards` (and the ones that call them: `copy_n`, `rotate_copy`, `merge`, `set_union`, `set_difference`, and `set_symmetric_difference`). This is because the first four 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 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 |

Last Updated: 1-Jul-2018