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 | ||
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 | 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 | ||
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 | ||
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 | ||
P0019R8 | LWG | Atomic Ref | Rapperswil | ||
P0458R2 | LWG | Checking for Existence of an Element in Associative Containers | Rapperswil | ||
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 | ||
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 | ||
P0758R1 | LWG | Implicit conversion traits and utility functions | Rapperswil | ||
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 | ||
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 | ||
P1023R0 | LWG | constexpr comparison operators for std::array | Rapperswil | ||
P1025R1 | CWG | Update The Reference To The Unicode Standard | Rapperswil | ||
P1120R0 | CWG | Consistency improvements for <=> and other comparison operators | Rapperswil |
[ 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 | |
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 | 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 | |
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 | 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 | |
2164 | What are the semantics of vector.emplace(vector.begin(), vector.back())? | Jacksonville | |
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 | |
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 | |
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 | |
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 | |
3104 | Fixing duration division | Rapperswil | Complete |
Last Updated: 23-Jul-2018