# 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 | In progress |
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 |  |
P0415R1 | LWG | Constexpr for `std::complex` | Albuquerque |  |
P0439R0 | LWG | Make `std::memory_order` a scoped enumeration | Albuquerque |  |
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 |
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 |  |
P0768R1 | CWG | Library Support for the Spaceship (Comparison) Operator | Albuquerque |  |
P0777R1 | LWG | Treating Unnecessary `decay` | Albuquerque |  |

[ 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]

### 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 |
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 |
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 |
2958 | Moves improperly defined as deleted | Albuquerque |
2964 | Apparently redundant requirement for dynamic_pointer_cast | Albuquerque |
2965 | Non-existing path::native_string() in filesystem_error::what() specification | Albuquerque |
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 |
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 |

Last Updated: 16-Jul-2017