C++ language support
Apple supports C++ with the Apple Clang compiler (included in Xcode) and the libc++
C++ standard library runtime (included in SDKs and operating systems). The compiler and runtime are regularly updated to offer new functionality, including many leading-edge features specified by the ISO C++ standard.
Supported features
The following tables list support for ISO C++ standard features available on Apple platforms and in the Apple Clang compiler, as well as links to related documentation. While most features are supported by all Apple operating systems, some features depend on specific OS capabilities or require support in the libc++.dylib shared library provided with the OS. Code that uses those features should be guarded by the minimal deployment target check as noted.
C++26 (expected)
Feature | Paper | Notes |
---|---|---|
Unevaluated strings | P2361R6 | Requires Xcode 16.3 |
constexpr cast from void* |
P2738R1 | Requires Xcode 16.3 |
On the ignorability of standard attributes | P2552R3 | Requires Xcode 16.3 |
User-generated static_assert messages |
P2741R3 | Requires Xcode 16.3 |
Placeholder variables with no name | P2169R4 | Requires Xcode 16.3 |
Template parameter initialization | P2308R1 | Requires Xcode 16.3 |
Remove Deprecated Arithmetic Conversion on Enumerations | P2864R2 | Requires Xcode 16.3 |
Clarifying rules for brace elision in aggregate initialization | P3106R1 | Requires Xcode 16.3 |
Pack Indexing | P2662R3 | Requires Xcode 16.3 |
\= delete("should have a reason"); | P2573R2 | Requires Xcode 16.3 |
Attributes for Structured Bindings | P0609R3 | Requires Xcode 16.3 |
Disallow Binding a Returned Glvalue to a Temporary | P2748R5 | Requires Xcode 16.3 |
Trivial infinite loops are not Undefined Behavior | P2809R3 | Requires Xcode 16.3 |
Deleting a Pointer to an Incomplete Type Should be Ill-formed | P3144R2 | Requires Xcode 16.3 |
Ordering of constraints involving fold expressions | P2963R3 | Requires Xcode 16.3 |
Remove undefined behavior from lexing | P2621R2 (DR) | Requires Xcode 16 |
Making non-encodable string literals ill-formed | P1854R4 (DR) | Requires Xcode 16 |
Add @, ,ドル and ` to the basic character set | P2558R2 | Requires Xcode 15 or later |
Unevaluated strings | P2361R6 | Requires Xcode 16 |
Features implemented in the libc++ library | ||
constexpr placement new |
P2747R2 | Requires Xcode 26 |
A type trait for detecting virtual base classes | P2985R0 | Requires Xcode 26 |
Concatenation of strings and string_views |
P2591R5 | Requires Xcode 16.3 |
Member visit |
P2637R3 | Requires Xcode 16.3 |
Printing Blank Lines with println |
P3142R0 | Requires Xcode 16.3 |
Interfacing stringstreams with string_view |
P2495R3 | Requires Xcode 16.3 |
Add tuple protocol to complex |
P2819R2 | Requires Xcode 16.3 |
Testing for success or failure of <charconv> functions |
P2497R0 | Requires Xcode 16 |
ADL-proof std::projected |
P2538R1 | Requires Xcode 16 |
Native handles and file streams | P1759R6 | Requires Xcode 16 |
Interfacing bitset with string_view |
P2697R1 | Requires Xcode 16 |
Saturation arithmetic | P0543R3 | Requires Xcode 16 |
Runtime format strings | P2905R2 | Requires Xcode 16 |
Runtime format strings II | P2918R2 | Requires Xcode 16 |
Fix formatting of code units as integers (Dude, where’s my char? ) |
P2909R4 | Requires Xcode 16 |
std::span over an initializer list |
P2447R6 | Requires Xcode 16 |
span.at() |
P2821R5 | Requires Xcode 16 |
Remove Deprecated std::allocator Typedef From C++26 |
P2868R3 | Requires Xcode 16 |
Remove basic_string::reserve() From C++26 |
P2870R3 | Requires Xcode 16 |
Remove Deprecated Unicode Conversion Facets from C++26 | P2871R3 | Requires Xcode 16 |
C++23
Feature | Paper | Notes |
---|---|---|
Deducing this |
P0847R7 | Requires Xcode 16.3 |
Change scope of lambda trailing-return-type | P2036R3 | Requires Xcode 16.3 |
Relaxing some constexpr restrictions |
P2448R2 | Requires Xcode 16.3 |
A type trait to detect reference binding to temporary | P2255R2 | Requires Xcode 16.3 |
Static and explicit object member functions with the same parameter-type-lists | P2797R0 | Requires Xcode 16.3 |
The Equality Operator You Are Looking For | P2468R2 | Requires Xcode 16 |
Labels at the end of compound statements | P2324R2 | Requires Xcode 16 |
static operator() |
P1169R4 | Requires Xcode 16 |
char8_t Compatibility and Portability Fix |
P2513R3 | Requires Xcode 16 |
static operator[] |
P2589R1 | Requires Xcode 16 |
Permitting static constexpr variables in constexpr functions |
P2647R1 | Requires Xcode 16 |
consteval needs to propagate up | P2564R3(DR) | Requires Xcode 16 |
Referencing The Unicode Standard | P2736R2 | Requires Xcode 16 |
De-deprecating volatile compound operations. |
P2327R1 | Requires Xcode 15 or later |
Support for #warning |
P2437R1 | Requires Xcode 15 or later |
Remove non-encodable wide character literals and multicharacter wide character literals | P2362R3 | Requires Xcode 15 or later |
Delimited escape sequences | P2290R3 | Requires Xcode 15 or later |
Named universal character escapes | P2071R2 | Requires Xcode 15 or later |
Support for UTF-8 as a portable source file encoding | P2295R6 | Requires Xcode 15 or later |
Relax requirements on wchar_t to match existing practices |
P2460R2 | Requires Xcode 15 or later |
Multidimensional subscript operator | P2128R6 | Requires Xcode 14.3 or later |
Non-literal variables (and labels and gotos) in constexpr functions |
P2242R3 | Requires Xcode 14.3 or later |
auto(x): decay-copy in the language |
P0849R8 | Requires Xcode 14.3 or later |
Literal suffix uz, z for size_t , ssize_t |
P0330R8 | |
Make () in lambdas optional in all cases |
P1102R2 | |
if consteval |
P1938R3 | |
Allow duplicate attributes | P2156R1 | |
Narrowing contextual conversions to bool |
P1401R5 | |
Trimming whitespaces before line splicing | P2223R2 | |
C++ identifier syntax using unicode standard annex 31 | P1949R7 | |
Mixed string literal concatenation |
P2201R1 | |
Character sets and encodings | P2314R4 | |
Consistent character literal encoding | P2316R2 | |
Preprocessing directives elifdef and elifndef |
P2334R1 | |
Extend init-statement to allow alias-declaration | P2360R0 | |
Attributes on lambda expressions | P2173R1 | |
Make declaration order layout mandated | P1847R4 | |
Features implemented in the libc++ library | ||
Relaxing Ranges Just A Smidge | P2609R3 | Requires Xcode 26 |
A trait for implicit lifetime types | P2674R1 | Requires Xcode 26 |
A Standard flat_map |
P0429R9 | Requires Xcode 26 |
Pipe support for user-defined range adaptors | P2387R3 | Requires Xcode 16.3 |
out_ptr - a scalable output pointer abstraction |
P1132R8 | Requires Xcode 16.3 |
std::ranges::contains_subrange (std::ranges::contains has been implemented in a previous release) |
P2302R4 | Requires Xcode 16.3 |
ranges::find_last(), ranges::find_last_if() , and anges::find_last_if_not() |
P1223R5 | Requires Xcode 16.3 |
Poison Pills are Too Toxic | P2602R2 | Requires Xcode 16.3 |
starts_with and ends_with |
P1659R3 | Requires Xcode 16 |
views::chunk_by |
P2443R1 | Requires Xcode 16 |
std::ranges::contains |
P2302R4 | Requires Xcode 16 Not supported: |
Support exclusive mode for fstreams |
P2467R1 | Requires Xcode 16 |
Add a conditional noexcept specification to std::apply |
P2517R1 | Requires Xcode 16 |
Should the output of std::print to a terminal be synchronized with the underlying stream? |
P2539R4 | Requires Xcode 16 |
Deprecate numeric_limits::has_denorm |
P2614R2 | Requires Xcode 16 |
Formatting ranges | P2286R8 | Requires Xcode 15.3 or later |
ranges::to : A function to convert any range to a container |
P1206R7 | Requires Xcode 15.3 or later |
move_iterator<T*> should be a random access iterator |
P2520R0 | Requires Xcode 15.3 or later |
constexpr type_info::operator==() |
P1328R1 | Requires Xcode 15.3 or later |
Formatting thread::id |
P2693R1 | Requires Xcode 15.3 or later |
Monadic operations for std::expected |
P2505R5 | Requires Xcode 15.3 or later |
Making multi-param constructors of views explicit | P2711R1 | Requires Xcode 15.3 or later |
std::invoke_r |
P2136R3 | Requires Xcode 15.3 or later |
Relaxing range adaptors to allow for move only types | P2494R2 | Requires Xcode 15.3 or later |
Improving default container formatting | P2585R1 | Requires Xcode 15.3 or later |
std::ranges::views::repeat |
P2474R2 | Requires Xcode 15.3 or later |
std::mdspan |
P0009R18 | Requires Xcode 15.3 or later |
Formatted output | P2093R14 | Requires Xcode 15.3 or later |
Add the missing empty to mdspan |
P2613R1 | Requires Xcode 15.3 or later |
mdspan: rename pointer and contiguous |
P2604R0 | Requires Xcode 15.3 or later |
string_view range constructor should be explicit |
P2499R0 | Requires Xcode 15 or later |
A more constexpr bitset |
P2417R2 | Requires Xcode 15 or later |
forward_like |
P2445R1 | Requires Xcode 15 or later |
Making std::unique_ptr constexpr |
P2273R3 | Requires Xcode 15 or later |
Add constexpr modifiers to functions to_chars and from_chars for integral types in <charconv> header |
P2291R3 | Requires Xcode 15 or later |
std::string::substr() && |
P2438R2 | Requires Xcode 15 or later |
std::expected |
P0323R12 | Requires Xcode 15 or later |
views::as_rvalue |
P2446R2 | Requires Xcode 15 or later |
std::unexpected should have error() as member accessor |
P2549R1 | Requires Xcode 15 or later |
Conditionally borrowed ranges | P2017R1 | Requires Xcode 15 or later |
Function to mark unreachable code std::unreachable() |
P0627R6 | Requires Xcode 14.3 or later |
Type trait to detect scoped enumerations std::is_scoped_enum |
P1048R1 | |
contains() function for basic_string and basic_string_view |
P1679R3 | |
std::to_underlying for enumerations |
P1682R3 | |
std::visit() for classes derived from std::variant |
P2162R2 | |
Prevent overconstraining allocators in container deduction guides | P1518R2 | |
Prohibit basic_string and basic_string_view construction from nullptr |
P2166R1 | |
Require span & basic_string_view to be trivially copyable |
P2251R1 |
C++20
Feature | Paper | Notes |
---|---|---|
Class types as non-type template parameters | P0732R2 | Requires Xcode 16.3 |
Immediate functions (consteval) |
P1073R3 | Requires Xcode 16.3 |
typename optional in more contexts |
P0634R3 | Requires Xcode 16 |
Structured binding extensions | P1091R3 | Requires Xcode 16 |
P1381R1 | ||
Parenthesized initialization of aggregates | P0960R3 | Requires Xcode 16 |
P1975R0 | ||
Concepts | P0734R0 | Not supported: papers P2103R0, DR1496, DR1734, P0848R3 |
P1084R2 | ||
P1141R2 | ||
P1616R1 | ||
P1452R2 | ||
P1972R0 | ||
P1980R0 | ||
P2493R0 | ||
P2092R0 | ||
Immediate functions (consteval ) |
P1073R3 | Requires Xcode 15 or later |
P1937R2 | ||
Default member initializers for bit-fields | P0683R1 | |
Fix const -qualified (const& -qualified) pointers to members |
P0704R1 | |
Allow lambda-capture [=, this] |
P0409R2 | |
__VA_OPT__ for comma omission and comma deletion |
P0306R4 | |
P1042R1 | ||
Designated initializers | P0329R4 | |
Familiar template-parameter-list syntax for generic lambdas | P0428R2 | |
Range-based for statements with initializer |
P0614R1 | |
ADL and function templates that are not visible | P0846R0 | |
const mismatch with defaulted copy constructor |
P0641R2 | |
Consistent comparison (operator<=> ) |
P0515R3 | |
P0905R1 | ||
P1120R0 | ||
P1185R2 | ||
P1186R3 | ||
P1630R1 | ||
P1946R0 | ||
P1959R0 | ||
P2085R0 | ||
Relaxing access checking on specializations | P0692R1 | |
Default constructible and assignable stateless lambdas | P0624R2 | |
Allowing lambdas in unevaluated contexts | P0315R4 | Not supported: [temp.deduct/9] |
[[no_unique_address]] attribute |
P0840R2 | |
[[likely]] and [[unlikely]] attributes |
P0479R5 | |
Pack expansion in lambda init-capture | P0780R2 | |
Relaxations of constexpr restrictions |
P1064R0 | |
P1002R1 | ||
P1327R1 | ||
P1330R0 | ||
P1331R2 | ||
P1668R1 | ||
P0784R7 | ||
Prohibit aggregates with user-declared constructors | P1008R1 | |
Feature test macros | P0941R2 | |
explicit(bool): conditionally explicit constructor |
P0892R2 | |
Signed integers are two’s complement | P1236R1 | |
char8_t: A type for UTF-8 characters and strings |
P0482R6 | |
std::is_constant |
P0595R2 | |
Nested inline namespaces | P1094R2 | |
Stronger unicode requirements | P1041R4 | |
P1139R2 | ||
Coroutines | P0912R5 | |
Deprecate comma operator in subscripting expressions like a[b,c] |
P1161R3 | |
Deprecate some problematic uses of volatile |
P1152R4 | |
[[nodiscard("with reason")]] |
P1301R4 | |
using enum |
P1099R5 | |
Permit conversions to arrays of unknown bound | P0388R4 | |
constinit |
P1143R2 | |
Pseudo-destructors end object lifetimes | P0593R6 (DR) | |
Implicit move for more local objects and rvalue references | P1825R0 (DR) | |
Features implemented in the libc++library | ||
Reviewing Deprecated Facilities of C++17 for C++20 | P0619R4 | Requires Xcode 26 |
The Mothership has Landed: Adding <=> to the Library | P1614R2 | Requires Xcode 16.3 |
Symmetry for spaceship | P0905R1 | Requires Xcode 16.3 |
std::atomic_ref |
P0019R8 | Requires Xcode 16.3 |
Add wait/notify to atomic_ref<T> |
P1643R1 | Requires Xcode 16.3 |
Missing constexpr in std::optional and std::variant |
P2231R1 | Requires Xcode 16.3 |
Floating Point Atomic | P0020R6 | Requires Xcode 16 |
Text formatting (std::format) |
P0645R10 | Requires Xcode 15.3 or later |
Efficient access to basic_stringbuf ’s buffer |
P0408R7 | Requires Xcode 15.3 or later |
Utility functions to implement uses-allocator construction | P0591R4 | Requires Xcode 15 or later |
char8_t: A type for UTF-8 characters and strings |
P0482R6 | Requires Xcode 15 or later |
nodiscard in the Library |
P0600R1 | Requires Xcode 15 or later |
polymorphic_allocator<> as a vocabulary type |
P0339R6 | Requires Xcode 15 or later |
Constexpr for std::complex |
P0415R1 | Requires Xcode 15 or later |
Adopt source_location for C++20 |
P1208R6 | Requires Xcode 15 or later |
Input Range Adaptors | P1035R7 | Requires Xcode 15 or later |
Views should not be required to be default constructible | P2325R3 | Requires Xcode 15 or later |
Smart pointer creation with default initialization | P1020R1 | Requires Xcode 15 or later |
Superior String Splitting | P2210R2 | Requires Xcode 15 or later |
basic_istream_view::iterator should not be copyable |
P1638R1 | Requires Xcode 15 or later |
Output std::chrono::days with ‘d’ suffix |
P1650R0 | Requires Xcode 15 or later |
Ranges adaptors for non-copyable iterators | P1862R1 | Requires Xcode 15 or later |
Rename "_default_init" Functions, Rev1 |
P1973R1 | Requires Xcode 15 or later |
elements_view needs its own sentinel |
P1994R1 | Requires Xcode 15 or later |
Fix istream_view |
P2432R1 | Requires Xcode 15 or later |
Making std::vector constexpr |
P1004R2 | Requires Xcode 14.3 or later |
Consistent stateful allocator propagation for operator+(basic_string) |
P1165R1 | Requires Xcode 14.3 or later |
Support arrays in make_shared and allocate_shared |
P0674R1 | Requires Xcode 14.3 or later |
Making std::string constexpr |
P0980R1 | Requires Xcode 14.3 or later |
Consider ATOMIC_FLAG_INIT undeprecation |
LWG3659 | Requires Xcode 14.3 or later |
char8_t backward compatibility remediation |
P1423R3 | Requires Xcode 14.3 or later |
Bit-casting object representations | P0476R2 | Requires Xcode 14.3 or later |
Ranges | P0896R4 | Requires Xcode 14.3 or later |
P2415R2 | Requires Xcode 14.3 or later | |
P2281R1 | Requires Xcode 14.3 or later | |
std::endian |
P0463R1 | |
Add constexpr modifiers to functions in <algorithm> and <utility> headers |
P0202R3 | |
Make std::memory_order a scoped enumeration |
P0439R0 | |
String prefix and suffix checking | P0457R2 | |
Transformation trait remove_cvref |
P0550R2 | |
De-pessimize legacy <numeric> algorithms with std::move |
P0616R0 | |
Utility to convert a pointer to a raw pointer | P0653R2 | |
Deprecate is_pod |
P0767R1 | |
Library support for the spaceship (comparison) operator <=> |
P0768R1 | |
Treating unnecessary decay | P0777R1 | |
<span> |
P0122R7 | |
Thou shalt not specialize std function templates! |
P0551R3 | |
<version> |
P0754R2 | |
Comparing unordered containers | P0809R0 | |
Constexpr iterator requirements | P0858R0 | |
string::reserve should not shrink |
P0966R1 | |
Checking for existence of an element in associative containers | P0458R2 | |
Guaranteed copy elision for piecewise construction | P0475R1 | |
Integral power-of-2 operations | P0556R3 | |
Reviewing deprecated facilities of C++17 for C++20 | P0619R4 | Not supported: P0619, Sections D.4, D.7, D.11, and D.12 |
Improving the return value of erase-like algorithms | P0646R1 | |
Efficient sized delete for variable sized classes | P0722R3 | |
Implicit conversion traits and utility functions | P0758R1 | |
fpos requirements |
P0759R1 | |
Add shift to <algorithm> |
P0769R2 | |
constexpr for swap and swap related functions |
P0879R0 | |
The identity metafunction | P0887R1 | |
Standard library concepts | P0898R3 | |
Eradicating unnecessarily explicit default constructors | P0935R0 | |
constexpr comparison operators for std::array |
P1023R0 | |
std::unwrap_ref_decay and std::unwrap_reference |
P0318R1 | |
Simplified partial function application | P0356R5 | |
Supporting Incomplete types In reference_wrapper |
P0357R3 | |
Fixing operator>>(basic_istream&, CharT*) |
P0487R1 | |
std::is_constant |
P0595R2 | |
Variant and optional should propagate copy/move triviality | P0602R4 | |
Improving variant’s Converting Constructor/Assignment | P0608R3 | |
visit<R>: explicit return type for visit |
P0655R1 | |
std::function move constructor should be noexcept |
P0771R1 | |
Heterogeneous lookup for unordered containers | P0919R3 | |
<chrono> zero(), min(), and max() should be noexcept |
P0972R0 | |
constexpr in std::pointer_traits |
P1006R1 | |
Misc constexpr bits |
P1032R1 | |
Remove comparison operators of std::span |
P1085R2 | |
Adopt consistent container erasure from library fundamentals 2 | P1209R0 | |
Remove CommonReference requirement from StrictWeakOrdering |
P1248R1 | |
Making std::underlying_type SFINAE-friendly |
P0340R3 | |
Well-behaved interpolation for numbers and pointers | P0811R3 | |
Usability enhancements for std::span |
P1024R3 | |
Make create_directory() intuitive |
P1164R1 | |
signed ssize() functions, unsigned size() functions |
P1227R2 | |
Traits for [Un]bounded Arrays | P1357R1 | |
Mandating the standard library: Clause 16 - Language support library | P1458R1 | |
Mandating the standard library Clause 18 - Diagnostics library | P1459R1 | |
Mandating the standard library: Clause 20 - Strings library | P1462R1 | |
Mandating the standard library: Clause 22 - Iterators library | P1464R1 | |
to_array from LFTS with updates |
P0325R4 | |
Bit operations | P0553R4 | |
Math constants | P0631R8 | |
More onstexpr containers |
P0784R7 | |
constexpr invoke |
P1065R2 | |
Synchronization library (<barrier> , <latch> , <semaphore> and notification functions on std::atomic ) |
P1135R6 | Minimum deployment target: macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0 |
Exposing a narrow contract for ceil2 | P1355R2 | |
Relocate endian’s specification | P1612R1 | |
bind_front should not unwrap reference_wrapper |
P1651R0 | |
Remove dedicated precalculated hash lookup interface | P1661R1 | |
Fixing atomic initialization | P0883R2 | |
Range constructor for std::string_view |
P1391R4 | |
Range constructor for std::span |
P1394R4 | |
constexpr for numeric algorithms |
P1645R1 | |
Heterogeneous lookup for unordered containers | P1690R1 | |
Add max() to latch and barrier |
P1865R1 | Minimum deployment target: macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0 |
Concept traits should be named after concepts | P1871R1 | |
span should have size_type , not index_type |
P1872R0 | |
Remove std::weak_equality and std::strong_equality |
P1959R0 | |
Safe integral comparisons | P0586R2 | |
Improving the return value of erase-like algorithms II: free erase/erase if | P1115R3 | |
On the names of low-level bit manipulation functions | P1956R1 | |
Wording for boolean-testable |
P1964R2 | |
Fixed-size span construction from dynamic range |
P1976R2 | |
Remove tuple-like protocol support from fixed-extent span | P2116R0 | |
Missing constexpr in std::optional and std::variant |
P2231R1 | Not supported: changes to std::variant |
C++17
Feature | Paper | Notes |
---|---|---|
static_assert with no message |
N3928 | |
Removing trigraphs | N4086 | |
typename in a template template parameter |
N4051 | |
New auto rules for direct-list-initialization |
N3922 | |
Fold expressions | N4295 | |
P0036R0 | ||
u8 character literals |
P0036R0 | |
Nested namespace definition | N4230 | |
Attributes for namespaces and enumerators | N4266 | |
Allow constant evaluation for all non-type template arguments | N4268 | |
Remove deprecated register storage class |
P0001R1 | |
Remove deprecated bool increment |
P0002R1 | |
Make exception specifications part of the type system | P0012R1 | |
__has_include in preprocessor conditionals |
P0061R1 | |
[[fallthrough]] attribute |
P0188R1 | |
[[nodiscard]] attribute |
P0189R1 | |
P1771R1 (DR) | ||
[[maybe_unused]] attribute |
P0212R1 | |
Aggregate initialization of classes with base classes | P0017R1 | |
constexpr lambda expressions |
P0170R1 | |
Differing begin and end types in range-based for |
P0184R0 | |
Lambda capture of *this |
P0018R3 | |
Direct-list-initialization of enum s |
P0138R2 | |
Hexadecimal floating-point literals | P0245R1 | |
Using attribute namespaces without repetition | P0028R4 | |
Dynamic memory allocation for over-aligned data | P0035R4 | |
Template argument deduction for class templates | P0091R3 | |
P0512R0 | ||
P0620R0 (DR) | ||
P0702R1 (DR) | ||
Non-type template parameters with auto type |
P0127R2 | |
Guaranteed copy elision | P0135R1 | |
Stricter expression evaluation order | P0145R3 | |
P0400R0 | ||
Requirement to ignore unknown attributes | P0283R2 | |
constexpr if statements |
P0292R2 | |
Inline variables | P0386R2 | |
Structured bindings | P0217R3 | |
P0961R1 (DR) | ||
P0969R0 (DR) | ||
Separate variable and condition for if and switch |
P0305R1 | |
Matching of template template-parameters to arguments | P0522R0 | This feature can be source breaking. Should be enabled explicitly with the compiler flag -frelaxed-template-template-args |
Removing deprecated dynamic exception specifications | P0003R5 | |
Features implemented in the libc++library | ||
<memory_resource> |
P0220R1 | Requires Xcode 15 Minimum deployment target: iOS 17.0, macOS 14.0, watchOS 10.0 and tvOS 17.0. |
Filesystem library | P0219R1 | Minimum deployment target: macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0 |
P0218R1 | ||
P0392R0 | ||
P0317R1 | ||
P0492R2 | ||
TransformationTrait Alias void_t . |
N3911 | |
Invoke function template | N4169 | |
std::uncaught |
N4259 | |
TriviallyCopyable reference_wrapper . |
N4277 | |
Improved insertion interface for unique-key maps. | N4279 | |
std::size() , std::empty() and std::data() |
N4280 | |
Contiguous Iterators | N4284 | |
Cleanup for exception-specification and throw-expression. | N4285 | |
Improving std::pair and std::tuple |
N4387 | |
bool_constant |
N4389 | |
shared_mutex |
N4508 |
Pass |
LWG 2228 missing SFINAE rule | N4366 | |
Minimal incomplete type support for standard containers | N4510 | |
Remove deprecated iostreams aliases. | P0004R1 | |
Adopt type traits variable templates for C++17 | P0006R0 | |
Polishing <chrono> |
P0092R1 | |
Constant view: std::as_const helper function template. |
P0007R1 | |
Making std::owner_less more flexible |
P0074R0 | |
Logical type traits rev 2 | P0013R1 | |
Re-enabling shared_from_this | P0033R1 | |
Adopt not_fn from library fundamentals 2 for C++17 |
P0005R4 | |
constexpr atomic::is_always |
P0152R1 | |
[nothrow-]swappable traits | P0185R1 | |
Fixing a design mistake in the searchers interface | P0253R1 | |
An algorithm to clamp a value between a pair of boundary values |
P0025R0 | |
3-argument overload to std::hypot |
P0030R1 | |
Constexpr modifiers for reverse_iterator , move_iterator , array and Range Access |
P0031R0 | |
Give std::string a non-const .data() member function |
P0272R1 | |
is_callable , the missing INVOKE related trait |
P0077R2 | |
Homogeneous interface for variant , any and optional |
P0032R3 | |
Extending memory management tools | P0040R3 | |
C++17 should refer to C11 instead of C99 | P0063R3 | |
Splicing maps and sets | P0083R3 | |
Emplace return type | P0084R2 | |
Variant: a type-safe union for C++17 | P0088R3 |
Minimum deployment target: Pass |
Replacement of class objects containing reference members | P0137R1 | |
shared_ptr::weak_type |
P0163R0 | |
Synopses for the c library | P0175R1 | |
Reserve a new library namespace for future standardization | P0180R2 | |
make_from_tuple : apply for construction |
P0209R2 | |
Integrating std::string_view and std::string |
P0254R2 | |
has_unique_object |
P0258R2 | |
Adopt selected library fundamentals V2 components for C++17 | P0295R0 | |
Adopt library fundamentals V1 TS components for C++17 (optional , string_view , any ) |
P0220R1 |
Minimum deployment target: Pass |
Removing allocator support in std::function |
P0302R1 | |
Making optional greater equal again | P0307R2 | |
Better names for parallel execution policies in C++17 | P0336R1 | |
Delete operator= for polymorphic_allocator |
P0337R0 | |
A <random> nomenclature tweak |
P0346R1 | |
Fixes for not_fn |
P0358R1 | |
Temporarily discourage memory_order_consume |
P0371R1 | |
Making variant greater equal | P0393R3 | |
Removing deprecated exception specifications from C++17 | P0003R5 | |
Elementary string conversions std::to_chars , std::from_chars |
P0067R5 | Minimum deployment target: For floating-point types, macOS 13.3, iOS 16.3, tvOS 16.3, watchOS 9.3 |
Literal suffixes for basic_string_view |
P0403R1 | |
Merging shared_ptr changes from Library Fundamentals to C++17 |
P0414R2 | |
Constexpr for std::char_traits |
P0426R1 | |
Resolving LWG Issues re common_type |
P0435R1 | |
Correcting library usage of "literal type" | P0503R0 | |
Revisiting in-place tag types for any/optional/variant | P0504R0 | |
Wording for GB 50 - constexpr for chrono |
P0505R0 | |
Updating "Restrictions on exception handling" | P0509R1 | |
Disallowing references, incomplete types, arrays, and empty variants | P0510R0 | |
Poisoning the hash | P0513R0 | |
Clarify that shared_future ’s copy operations have wide contracts |
P0516R0 | |
Make future_error constructible |
P0517R0 | |
shared_ptr use_count/unique |
P0521R0 | |
Variadic lock guard(rev 5) | P0156R2 | |
A byte type definition | P0298R3 | |
File system library on non-POSIX-like operating systems | P0430R2 | |
Integrating template deduction for class templates into the standard library | P0433R2 | |
common_type and duration |
P0548R1 | |
Resolving atomic<T> named base class inconsistencies |
P0558R1 | |
noexcept for hash functions |
P0599R1 | |
Resolving GB 55, US 84, US 85, US 86 | P0604R0 | |
Some improvements to class template argument deduction integration into the standard library | P0739R0 |
C++14
Feature | Paper | Notes |
---|---|---|
Tweak to certain c++ contextual conversions | N3323 | |
Binary literals | N3472 | |
decltype(auto) | N3638 | |
Return type deduction for normal functions | ||
Initialized lambda captures | N3648 | |
Generic lambdas | N3649 | |
Variable templates | N3651 | |
Relaxing requirements on constexpr functions | N3652 | |
Member initializers and aggregates | N3653 | |
Clarifying memory allocation | N3664 | |
[[deprecated]] attribute |
N3760 | |
Single quotation mark as digit separator | N3781 | |
Sized deallocation (delete and delete[] ) |
N3778 | |
Features implemented in the libc++library | ||
Terminology for container element requirements - Rev 1 | N3346 | |
Making operator functors greater<> |
N3421 | |
std::result_of and SFINAE |
N3462 | |
integral_constant improvements |
N3545 | |
Null forward iterators | N3644 | |
std::exchange() |
N3668 | |
Compile-time integer sequences | N3658 | |
Addressing tuples by type | N3670 | |
Making non-modifying sequence operations more robust | N3671 | |
make_unique |
N3656 | |
Quoted Strings | N3654 | |
User-defined Literals | N3642 | |
TransformationTraits Redux (excluding part 4) |
N3655 | |
Heterogeneous comparison lookup | N3657 | |
Fixing constexpr member functions without const |
N3669 | |
Shared locking | N3659 | |
User-defined literals for std::complex |
N3779 | |
Discouraging rand() |
N3924 | |
Consistent metafunction aliases | N3887 | |
Rename shared_mutex to shared_timed_mutex |
N3891 | |
Constexpr library additions: chrono, containers, utilities, complex numbers, functional | N3469 | |
N3470 | ||
N3471 | ||
N3302 | ||
N3789 |
C++11
Feature | Paper | Notes |
---|---|---|
Rvalue references | N2118 | |
P1825R0 (DR) | ||
Rvalue references for *this |
N2439 | |
Initialization of class objects by rvalues | N1610 | |
Non-static data member initializers | N2756 | |
Variadic templates | N2242 | |
Extending variadic template template parameters | N2555 | |
Initializer lists | N2672 | |
P1009R2 (DR) | ||
P1957R2 (DR) | ||
Static assertions | N1720 | |
auto -typed variables |
N1984 | |
Multi-declarator auto |
N1737 | |
Removal of auto as a storage-class specifier |
N2546 | |
New function declarator syntax | N2541 | |
Declared type of an expression | N2343 | |
Incomplete return types | N3276 | |
Right angle brackets | N1757 | |
Default template arguments for function templates | DR226 | |
Solving the SFINAE problem for expressions | DR339 | |
Alias templates | N2258 | |
Extern templates | N1987 | |
Null pointer constant | N2431 | |
Strongly-typed enums | N2347 | |
Forward declarations for enums | N2764 | |
DR1206 | ||
Standardized attribute syntax | N2761 | |
ConstExpr: generalized constant expressions |
N2235 | |
P0859R0 (DR) | ||
Alignment support | N2341 | |
Conditionally-support behavior | N1627 | |
Changing undefined behavior into diagnosable errors | N1727 | |
Delegating constructors | N1986 | |
Inheriting constructors | N2540 | |
P0136R1 (DR) | ||
Explicit conversion operators | N2437 | |
New character types | N2249 | |
Unicode string literals | N2442 | |
Raw string literals | N2442 | |
Universal character names in literals | N2170 | |
User-defined literals | N2765 | |
Standard Layout Types | N2342 | |
Defaulted functions | N2346 | |
P1286R2 (DR) | ||
Deleted functions | N2346 | |
Extended friend declarations | N1791 | |
Extending sizeof |
N2253 | |
DR850 | ||
Inline namespaces | N2535 | |
Unrestricted unions | N2544 | |
Local and unnamed types as template arguments | N2657 | |
Range-based for | N2930 | |
P0962R1 (DR) | ||
Explicit virtual overrides | N2928 | |
N3206 | ||
N3272 | ||
Allowing move constructors to throw [noexcept] |
N3050 | |
Defining move special member functions | N3053 | |
Concurrency | ||
Sequence points | N2239 | |
Atomic operations | N2427 | |
Strong compare and exchange | N2748 | |
Bidirectional fences | N2752 | |
Memory model | N2429 | |
Data-dependency ordering: atomics and memory model | N2664 | |
Propagating exceptions | N2179 | |
Allow atomics use in signal handlers | N2547 | |
Thread-local storage | N2659 | |
Dynamic initialization and destruction with concurrency | N2660 | |
C99 Features in C++11 | ||
__func__ predefined identifier |
N2340 | |
C99 preprocessor | N1653 | |
long long |
N1811 |
C++98/03
Clang and libc++ supports all features of the ISO C++ 1998 standard and the defects addressed in the ISO C++ 2003 standard.
C++ standard library hardening
Starting in Xcode 16, the C++ standard library supports hardening. Turning on hardening enables checks for common cases of misuse of the standard library; if a check fails, the program is reliably terminated, helping prevent security vulnerabilities and diagnose some cases of undefined behavior.
Hardening can be turned on via Xcode Build Settings (Apple Clang - Language - C++
> Enable C++ Standard Library Hardening)
:
- "
No
" — don’t enable any hardening checks. - "
Yes (fast)
" — enable low-overhead security-critical checks at runtime. We recommend most applications to adopt this setting in the production environment. - "
Yes (extensive)
" — enable all available low-overhead checks at runtime, including general logic errors in addition to security vulnerabilities. This setting has a higher overhead compared to "Yes" but is still intended to be usable in production by applications that would benefit from the increased level of correctness checking. - "
Yes (debug)
" — enable all available checks, including heuristic checks that might have significant performance overhead, as well as internal library assertions. We recommend most applications to use this setting in non-production environments (such as test suites and CI, as well as for local development). This setting should not be used in production due to the overhead.
Note that the Debug configuration enables debug
hardening mode by default. When enabling hardening, make sure not to accidentally override the stricter debug
mode with a less-strict production-capable mode in the Debug configuration. Turning on hardening might expose latent bugs and cause the application to terminate at runtime. We recommend testing your code thoroughly in a development environment.
For more information about hardening, refer to the libc++ documentation.
Related resources
Videos
Release notes and documentation
- Older release notes: