1 <section xmlns="http://docbook.org/ns/docbook" version="5.0"
2 xml:id="status.iso.2017" xreflabel="Status C++ 2017">
3 <?dbhtml filename="status_iso_cxx2017.html"?>
5 <info><title>C++ 2017</title>
7 <keyword>ISO C++</keyword>
8 <keyword>2017</keyword>
13 In this implementation the <literal>-std=gnu++17</literal> or
14 <literal>-std=c++17</literal> flag must be used to enable language
16 features. See <link linkend="manual.intro.using.flags">dialect</link>
17 options. The pre-defined symbol
18 <constant>__cplusplus</constant> is used to check for the
19 presence of the required flag.
20 GCC 9.1 was the first release with non-experimental C++17 support,
21 so the API and ABI of features added in C++17 is only stable
26 This section describes the C++17 and library TS support in
27 mainline GCC, not in any particular release.
31 The following table lists new library features that are included in
32 the C++17 standard. The "Proposal" column provides a link to the
33 ISO C++ committee proposal that describes the feature, while the "Status"
34 column indicates the first version of GCC that contains an implementation of
35 this feature (if it has been implemented).
36 The "SD-6 Feature Test" column shows the corresponding macro or header from
37 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations">SD-6:
38 Feature-testing recommendations for C++</link>.
41 <table frame="all" xml:id="table.cxx17_features">
42 <title>C++ 2017 Library Features</title>
44 <tgroup cols="4" align="left" colsep="0" rowsep="1">
45 <colspec colname="c1"/>
46 <colspec colname="c2"/>
47 <colspec colname="c3"/>
48 <colspec colname="c4"/>
51 <entry>Library Feature</entry>
52 <entry>Proposal</entry>
54 <entry>SD-6 Feature Test</entry>
62 <code>constexpr std::hardware_{constructive,destructive}_interference_size</code>
65 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0154r1.html">
69 <entry align="center"> 12.1 </entry>
70 <entry> <code>__cpp_lib_hardware_interference_size >= 201603</code> </entry>
74 <entry> Core Issue 1776: Replacement of class objects containing reference members</entry>
76 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0137r1.html">
80 <entry align="center"> 7.1 </entry>
81 <entry> <code>__cpp_lib_launder >= 201606</code> </entry>
85 <entry>Wording for <code>std::uncaught_exceptions</code></entry>
87 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/JTC1/sc22/WG21/docs/papers/2014/n4259.pdf">
91 <entry align="center">6.1</entry>
92 <entry><code>__cpp_lib_uncaught_exceptions >= 201411</code></entry>
96 <entry> C++17 should refer to C11 instead of C99 </entry>
98 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0063r3.html">
102 <entry align="center"> 9.1 </entry>
107 <entry> Variant: a type-safe union for C++17 </entry>
109 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0088r3.html">
113 <entry align="center"> 7.1 </entry>
114 <entry> <code>__has_include(<variant>)</code>,
115 <code>__cpp_lib_variant >= 201603</code>
116 (since 7.3, see Note 1)
121 <entry> Library Fundamentals V1 TS Components: <code>optional</code> </entry>
123 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0220r1.html">
127 <entry align="center"> 7.1 </entry>
128 <entry> <code>__has_include(<optional>)</code>,
129 <code>__cpp_lib_optional >= 201603</code>
130 (since 7.3, see Note 1)
135 <entry> Library Fundamentals V1 TS Components: <code>any</code> </entry>
137 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0220r1.html">
141 <entry align="center"> 7.1 </entry>
142 <entry> <code>__has_include(<any>)</code>,
143 <code>__cpp_lib_any >= 201603</code>
144 (since 7.3, see Note 1)
149 <entry> Library Fundamentals V1 TS Components: <code>string_view</code> </entry>
151 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0220r1.html">
155 <entry align="center"> 7.1 </entry>
156 <entry> <code>__has_include(<string_view>)</code>,
157 <code>__cpp_lib_string_view >= 201603</code>
158 (since 7.3, see Note 1)
163 <entry> Library Fundamentals V1 TS Components: <code>memory_resource</code> </entry>
165 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0220r1.html">
169 <entry align="center"> 9.1 </entry>
170 <entry> <code>__has_include(<memory_resource>)</code>,
171 <code>__cpp_lib_memory_resource >= 201603</code>
176 <entry> Library Fundamentals V1 TS Components: <code>apply</code> </entry>
178 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0220r1.html">
182 <entry align="center"> 7.1 </entry>
183 <entry> <code>__cpp_lib_apply >= 201603</code> </entry>
187 <entry> Library Fundamentals V1 TS Components: <code>shared_ptr<T[]></code> </entry>
189 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0220r1.html">
193 <entry align="center"> 7.1 </entry>
194 <entry> <code>__cpp_lib_shared_ptr_arrays >= 201603</code> </entry>
198 <entry> Library Fundamentals V1 TS Components: Searchers </entry>
200 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0220r1.html">
204 <entry align="center"> 7.1 </entry>
205 <entry> <code>__cpp_lib_boyer_moore_searcher >= 201603</code> </entry>
209 <entry> Library Fundamentals V1 TS Components: Sampling </entry>
211 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0220r1.html">
215 <entry align="center"> 7.1 </entry>
216 <entry> <code>__cpp_lib_sample >= 201603</code> </entry>
220 <entry> Constant View: A proposal for a <code>std::as_const</code> helper function template </entry>
222 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="">
226 <entry align="center"> 7.1 </entry>
227 <entry><code> __cpp_lib_as_const >= 201510 </code></entry>
231 <entry> Improving pair and tuple </entry>
233 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4387">
237 <entry align="center"> 6.1 </entry>
242 <entry> <code>make_from_tuple</code>: apply for construction </entry>
244 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0209r2.pdf">
248 <entry align="center"> 7.1 </entry>
249 <entry><code> __cpp_lib_make_from_tuple >= 201606 </code></entry>
253 <?dbhtml bgcolor="#C8B0B0" ?>
255 Removing <code>auto_ptr</code>, <code>random_shuffle()</code>,
256 And Old <code><functional></code> Stuff
259 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4190.htm">
263 <entry align="center">No (kept for backwards compatibility)</entry>
268 <entry> Deprecating Vestigial Library Parts in C++17 </entry>
270 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0174r2.html">
274 <entry align="center"> 12.1 </entry>
279 <entry> Making <code>std::owner_less</code> more flexible </entry>
281 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0074r0.html">
285 <entry align="center"> 7.1 </entry>
286 <entry><code> __cpp_lib_transparent_operators >= 201510 </code></entry>
290 <entry> <code>std::addressof</code> should be constexpr </entry>
292 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0304r0.html#2296">
296 <entry align="center"> 7.1 </entry>
297 <entry><code> __cpp_lib_addressof_constexpr >= 201603 </code></entry>
301 <entry> Safe conversions in <code>unique_ptr<T[]></code> </entry>
303 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4089.pdf">
307 <entry align="center"> 6 </entry>
312 <entry> LWG 2228: Missing SFINAE rule in unique_ptr templated assignment </entry>
314 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4366.html">
318 <entry align="center"> 6 </entry>
323 <entry> Re-enabling <code>shared_from_this</code></entry>
325 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0033r1.html">
329 <entry align="center"> 7.1 </entry>
330 <entry><code>__cpp_lib_enable_shared_from_this >= 201603</code></entry>
334 <entry> A proposal to add <code>invoke</code> function template </entry>
336 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4169.html">
340 <entry align="center"> 6.1 </entry>
341 <entry><code> __cpp_lib_invoke >= 201411 </code></entry>
345 <entry>TriviallyCopyable <code>reference_wrapper</code> </entry>
347 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4277.html">
351 <entry align="center"> 5.1 </entry>
356 <entry> Adopt <code>not_fn</code> from Library Fundamentals 2 for C++17 </entry>
358 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0005r4.html">
362 <entry align="center"> 7.1 </entry>
363 <entry><code>__cpp_lib_not_fn >= 201603</code></entry>
367 <entry> Fixes for <code>not_fn</code> </entry>
369 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0358r1.html">
373 <entry align="center"> 7.1 </entry>
378 <entry> Fixing a design mistake in the searchers interface in Library Fundamentals </entry>
380 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0253r1.pdf">
384 <entry align="center"> 7.1 </entry>
389 <entry> Extending memory management tools </entry>
391 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0040r3.html">
395 <entry align="center"> 7.1 </entry>
396 <entry><code>__cpp_lib_raw_memory_algorithms >= 201606L</code></entry>
400 <entry> <code>shared_ptr::weak_type</code></entry>
402 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0163r0.html">
406 <entry align="center"> 7.1 </entry>
407 <entry><code> __cpp_lib_shared_ptr_weak_type >= 201606</code></entry>
411 <entry>Transformation Trait Alias <code>void_t</code></entry>
413 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/JTC1/sc22/WG21/docs/papers/2014/n3911.pdf">
417 <entry align="center">6.1</entry>
418 <entry><code> __cpp_lib_void_t >= 201411</code></entry>
422 <entry> Wording for <code>bool_constant</code>, revision 1 </entry>
424 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4389.html">
428 <entry align="center">6.1</entry>
429 <entry><code> __cpp_lib_bool_constant >= 201505</code></entry>
433 <entry> Adopt Type Traits Variable Templates from Library Fundamentals TS for C++17</entry>
435 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0006r0.html">
439 <entry align="center"> 7.1 </entry>
440 <entry><code> __cpp_lib_type_trait_variable_templates >= 201510 </code></entry>
444 <entry> Logical Operator Type Traits</entry>
446 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0013r1.html">
450 <entry align="center"> 6.1 </entry>
451 <entry><code> __cpp_lib_logical_traits >= 201510 </code></entry>
455 <entry> Adding [nothrow-]swappable traits </entry>
457 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0185r1.html">
461 <entry align="center"> 7.1 (<code>__is_swappable</code> available since 6.1)</entry>
462 <entry><code> __cpp_lib_is_swappable >= 201603 </code></entry>
466 <entry> <code>is_callable</code>, the missing INVOKE related trait</entry>
468 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0077r2.html">
472 <entry align="center"> 7.1 </entry>
473 <entry><code> __cpp_lib_is_invocable >= 201703 </code></entry>
477 <entry> has_unique_object_representations </entry>
479 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0258r2.html">
483 <entry align="center"> 7.1 </entry>
484 <entry><code> __cpp_lib_has_unique_object_representations >= 201606 </code></entry>
488 <entry> Polishing <code><chrono></code> </entry>
490 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0092r1.html">
494 <entry align="center"> 7.1 </entry>
495 <entry><code> __cpp_lib_chrono >= 201510 </code></entry>
499 <entry> Adding more constexpr to <code><chrono></code> </entry>
501 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0505r0.html">
505 <entry align="center"> 7.1 </entry>
506 <entry><code> __cpp_lib_chrono >= 201611 </code>
507 (since 7.3, see Note 2)
512 <entry> Constexpr for <code>std::char_traits</code> </entry>
514 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0426r1.html">
518 <entry align="center"> 8.1 </entry>
519 <entry><code> __cpp_lib_constexpr_string >= 201611 </code></entry>
523 <entry> Integrating <code>std::string_view</code> and <code>std::string</code> </entry>
525 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0254r2.pdf">
529 <entry align="center"> 7.1 </entry>
530 <entry><code> </code></entry>
534 <entry> Give 'std::string' a non-const '.data()' member function </entry>
536 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0272r1.html">
540 <entry align="center"> 7.1 </entry>
541 <entry><code> </code></entry>
545 <entry>Cleaning-up noexcept in the Library</entry>
547 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4258.pdf">
551 <entry align="center">6.1</entry>
552 <entry><code> __cpp_lib_allocator_traits_is_always_equal >= 201411 </code></entry>
556 <entry>Contiguous Iterators </entry>
558 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4284.html">
562 <entry align="center">N/A</entry>
567 <entry> Minimal incomplete type support for standard containers </entry>
569 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4510.html">
573 <entry align="center"> 3.0 </entry>
574 <entry><code> __cpp_lib_incomplete_container_elements >= 201505 </code>
575 (since 6.2, see Note 2)
580 <entry> Emplace return type </entry>
582 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0084r2.pdf">
586 <entry align="center"> 7.1 </entry>
591 <entry>Improved insertion interface for unique-key maps</entry>
593 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4279.html">
597 <entry align="center"> 6.1 </entry>
598 <entry><code> __cpp_lib_map_try_emplace >= 201411</code>,
599 <code> __cpp_lib_unordered_map_try_emplace >= 201411</code>
604 <entry> Splicing Maps and Sets </entry>
606 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0083r3.pdf">
610 <entry align="center"> 7.1 </entry>
611 <entry><code> __cpp_lib_node_extract >= 201606 </code></entry>
615 <entry>Non-member <code>size()</code> and more</entry>
617 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4280.pdf">
621 <entry align="center"> 6.1 </entry>
622 <entry><code> __cpp_lib_nonmember_container_access >= 201411 </code></entry>
626 <entry> A Proposal to Add Constexpr Modifiers to <code>reverse_iterator</code>, <code>move_iterator</code>, <code>array</code> and Range Access </entry>
628 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0031r0.html">
632 <entry align="center"> 7.1 </entry>
633 <entry><code> __cpp_lib_array_constexpr >= 201603 </code></entry>
637 <?dbhtml bgcolor="#B0B0B0" ?>
638 <entry> The Parallelism TS Should be Standardized </entry>
640 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0024r2.html">
644 <entry align="center"> 9.1 </entry>
645 <entry><code> __has_include(<execution>)</code>,
646 <code> __cpp_lib_execution >= 201603 </code>,
647 <code> __cpp_lib_parallel_algorithm >= 201603 </code>
648 (requires linking with <code>-ltbb</code>, see Note 3)
653 <entry> An algorithm to "clamp" a value between a pair of boundary values </entry>
655 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0025r0.html">
659 <entry align="center"> 7.1 </entry>
660 <entry><code> __cpp_lib_clamp >= 201603 </code></entry>
664 <entry> Adopt Selected Library Fundamentals V2 Components for C++17 </entry>
666 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0295r0.pdf">
670 <entry align="center"> 7.1 </entry>
671 <entry><code> __cpp_lib_gcd_lcm >= 201606 </code></entry>
675 <entry> Proposal to Introduce a 3-Argument Overload to <code>std::hypot</code> </entry>
677 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0030r1.pdf">
681 <entry align="center"> 7.1 </entry>
682 <entry><code> __cpp_lib_hypot >= 201603 </code></entry>
686 <entry> Mathematical Special Functions for C++17 </entry>
688 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0226r1.pdf">
692 <entry align="center"> 7.1 </entry>
693 <entry><code> __cpp_lib_math_special_functions >= 201603 </code>
699 <entry>Adopt the File System TS for C++17 </entry>
701 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0218r1.html">
705 <entry align="center"> 8.1 </entry>
706 <entry><code> __has_include(<filesystem>)</code>,
707 <code> __cpp_lib_filesystem >= 201603 </code>
708 (GCC 8.x requires linking with <code>-lstdc++fs</code>)
713 <entry> Relative Paths for Filesystem</entry>
715 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0219r1.html">
719 <entry align="center"> 8.1 </entry>
720 <entry><code> __cpp_lib_filesystem >= 201606 </code></entry>
724 <entry> Adapting string_view by filesystem paths </entry>
726 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0392r0.pdf">
730 <entry align="center"> 8.1 </entry>
731 <entry><code> __cpp_lib_filesystem >= 201606 </code></entry>
735 <entry> Directory Entry Caching for Filesystem </entry>
737 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0317r1.html">
741 <entry align="center"> 8.1 </entry>
742 <entry><code> __cpp_lib_filesystem >= 201703 </code></entry>
746 <entry> constexpr <code>atomic<T>::is_always_lock_free</code> </entry>
748 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0152r1.html">
752 <entry align="center"> 7.1 </entry>
753 <entry><code> __cpp_lib_atomic_is_always_lock_free >= 201603 </code></entry>
757 <entry>A proposal to add <code>shared_mutex</code> (untimed) (Revision 4)</entry>
759 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4508.html">
763 <entry align="center"> 6.1 </entry>
764 <entry><code> __cpp_lib_shared_mutex >= 201505 </code></entry>
768 <entry> Variadic <code>lock_guard</code> (Rev. 5) </entry>
770 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0156r2.html">
774 <entry align="center"> 7.1 </entry>
775 <entry><code> __cpp_lib_scoped_lock >= 201703 </code></entry>
779 <entry> A byte type definition </entry>
781 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0298r3.pdf">
785 <entry align="center"> 7.1 </entry>
786 <entry><code> __cpp_lib_byte >= 201603 </code> (since 7.3, see Note 2)
791 <entry> Elementary string conversions </entry>
793 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0067r5.html">
797 <entry align="center"> 11.1 (integral types supported since 8.1) </entry>
798 <entry><code> __has_include(<charconv>)</code>,
799 <code> __cpp_lib_to_chars >= 201611 </code></entry>
803 <entry> Homogeneous interface for variant, any and optional </entry>
805 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0032r3.pdf">
809 <entry align="center"> 7.1 </entry>
811 <code> __cpp_lib_any >= 201606 </code>,
812 <code> __cpp_lib_optional >= 201606 </code>,
813 <code> __cpp_lib_variant >= 201606 </code>
818 <entry> Making Optional Greater Equal Again </entry>
820 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0307r2.pdf">
824 <entry align="center"> 7.1 </entry>
825 <entry> <code> __cpp_lib_optional >= 201606 </code> </entry>
833 Note 1: This feature is supported in GCC 7.1 and 7.2 but before GCC 7.3 the
834 <code>__cpp_lib</code> macro is not defined, and compilation will fail if the
835 header is included without using <option>-std</option> to enable C++17 support.
839 Note 2: This feature is supported in older releases but the
840 <code>__cpp_lib</code> macro is not defined to the right value
841 (or not defined at all) until the version shown in parentheses.
845 Note 3: The Parallel Algorithms have an external dependency on Intel TBB 2018
846 or later. If the <filename class="headerfile"><execution></filename>
847 header is included then <code>-ltbb</code> must be used to link to TBB.
851 Note 4: The mathematical special functions are enabled in C++17 mode from
852 GCC 7.1 onwards. For GCC 6.x or for C++11/C++14 define
853 <code>__STDCPP_WANT_MATH_SPEC_FUNCS__</code> to a non-zero value
854 and test for <code>__STDCPP_MATH_SPEC_FUNCS__ >= 201003L</code>.
860 The following status table is based on the table of contents of
862 Some subclauses are not shown in the table where the content is unchanged
863 since C++14 and the implementation is complete.
866 <table frame="all" xml:id="table.cxx17_status">
867 <title>C++ 2017 Implementation Status</title>
869 <tgroup cols="4" align="left" colsep="0" rowsep="1">
870 <colspec colname="c1"/>
871 <colspec colname="c2"/>
872 <colspec colname="c3"/>
873 <colspec colname="c4"/>
876 <entry>Section</entry>
877 <entry>Description</entry>
878 <entry>Status</entry>
879 <entry>Comments</entry>
887 <emphasis>21</emphasis>
889 <entry namest="c2" nameend="c4" align="left">
890 <emphasis>Language support</emphasis>
896 <entry>General</entry>
902 <entry>Common definitions</entry>
908 <entry>Implementation properties</entry>
913 <entry>21.3.1</entry>
914 <entry>General</entry>
919 <entry>21.3.2</entry>
920 <entry>Header <code><limits></code> synopsis</entry>
925 <entry>21.3.3</entry>
926 <entry>Floating-point type properties</entry>
931 <?dbhtml bgcolor="#C8B0B0" ?>
932 <entry>21.3.3.1</entry>
933 <entry><code>float_round_style</code></entry>
938 <?dbhtml bgcolor="#C8B0B0" ?>
939 <entry>21.3.3.2</entry>
940 <entry><code>float_denorm_style</code></entry>
945 <entry>21.3.4</entry>
946 <entry>Class template <code>numeric_limits</code></entry>
951 <entry>21.3.5</entry>
952 <entry>Header <code><climits></code> synopsis</entry>
957 <entry>21.3.6</entry>
958 <entry>Header <code><cfloat></code> synopsis</entry>
964 <entry>Integer types</entry>
969 <entry>21.4.1</entry>
970 <entry>Header <code><cstdint></code> synopsis</entry>
975 <?dbhtml bgcolor="#B0B0B0" ?>
977 <entry>Start and termination</entry>
978 <entry>Partial</entry>
979 <entry>C library dependency for quick_exit, at_quick_exit</entry>
983 <entry>Dynamic memory management</entry>
988 <entry>21.6.1</entry>
989 <entry>Header <code><new></code> synopsis</entry>
994 <entry>21.6.2</entry>
995 <entry>Storage allocation and deallocation</entry>
1000 <entry>21.6.3</entry>
1001 <entry>Storage allocation errors</entry>
1006 <entry>21.6.4</entry>
1007 <entry>Pointer optimization barrier</entry>
1012 <entry>21.6.5</entry>
1013 <entry>Hardware interference size</entry>
1019 <entry>Type identification</entry>
1025 <entry>Exception handling</entry>
1030 <entry>21.8.1</entry>
1031 <entry>Header <code><exception></code> synopsis</entry>
1036 <entry>21.8.2</entry>
1037 <entry>Class exception</entry>
1042 <entry>21.8.3</entry>
1043 <entry>Class bad_exception</entry>
1048 <entry>21.8.4</entry>
1049 <entry>Abnormal termination</entry>
1054 <entry>21.8.5</entry>
1055 <entry><code>uncaught_exceptions</code></entry>
1060 <entry>21.8.6</entry>
1061 <entry>Exception Propagation</entry>
1066 <entry>21.8.7</entry>
1067 <entry><code>nested_exception</code></entry>
1073 <entry>Initializer lists</entry>
1078 <entry>21.10</entry>
1079 <entry>Other runtime support</entry>
1085 <emphasis>22</emphasis>
1087 <entry namest="c2" nameend="c4" align="left">
1088 <emphasis>Diagnostics</emphasis>
1093 <entry>General</entry>
1099 <entry>Exception classes</entry>
1105 <entry>Assertions</entry>
1111 <entry>Error numbers</entry>
1117 <entry>System error support</entry>
1123 <emphasis>23</emphasis>
1125 <entry namest="c2" nameend="c4" align="left">
1126 <emphasis>General utilities</emphasis>
1131 <entry>General</entry>
1137 <entry>Utility components</entry>
1142 <entry>23.2.1</entry>
1143 <entry>Header <code><utility></code> synopsis</entry>
1148 <entry>23.2.2</entry>
1149 <entry>Operators</entry>
1154 <entry>23.2.3</entry>
1155 <entry><code>swap</code></entry>
1160 <entry>23.2.4</entry>
1161 <entry><code>exchange</code></entry>
1166 <entry>23.2.5</entry>
1167 <entry>Forward/move helpers</entry>
1172 <entry>23.2.6</entry>
1173 <entry>Function template <code>as_const</code></entry>
1178 <entry>23.2.7</entry>
1179 <entry>Function template <code>declval</code></entry>
1184 <entry>23.2.8</entry>
1185 <entry>Primitive numeric output conversion</entry>
1186 <entry>Partial</entry>
1190 <entry>23.2.9</entry>
1191 <entry>Primitive numeric input conversion</entry>
1192 <entry>Partial</entry>
1197 <entry>Compile-time integer sequences</entry>
1203 <entry>Pairs</entry>
1209 <entry>Tuples</entry>
1215 <entry>Optional objects</entry>
1221 <entry>Variants</entry>
1227 <entry>Storage for any type</entry>
1233 <entry>Bitsets</entry>
1238 <entry>23.10</entry>
1239 <entry>Memory</entry>
1244 <entry>23.10.1</entry>
1245 <entry>In general</entry>
1250 <entry>23.10.2</entry>
1251 <entry>Header <code><memory></code> synopsis</entry>
1256 <entry>23.10.3</entry>
1257 <entry>Pointer traits</entry>
1262 <entry>23.10.4</entry>
1263 <entry>Pointer safety</entry>
1268 <entry>23.10.5</entry>
1269 <entry>Align</entry>
1274 <entry>23.10.6</entry>
1275 <entry>Allocator argument tag</entry>
1280 <entry>23.10.7</entry>
1281 <entry><code>uses_allocator</code></entry>
1286 <entry>23.10.8</entry>
1287 <entry>Allocator traits</entry>
1292 <entry>23.10.9</entry>
1293 <entry>The default allocator</entry>
1298 <entry>23.10.10</entry>
1299 <entry>Specialized algorithms</entry>
1304 <entry>23.10.11</entry>
1305 <entry>C library memory allocation</entry>
1310 <entry>23.11</entry>
1311 <entry>Smart pointers</entry>
1316 <entry>23.11.1</entry>
1317 <entry>Class template <code>unique_ptr</code></entry>
1322 <entry>23.11.2</entry>
1323 <entry>Shared-ownership pointers</entry>
1328 <entry>23.12</entry>
1329 <entry>Memory resources</entry>
1334 <entry>23.12.1</entry>
1335 <entry>Header <code><memory_resource></code> synopsis</entry>
1340 <entry>23.12.2</entry>
1341 <entry>Class <code>memory_resource</code></entry>
1346 <entry>23.12.3</entry>
1347 <entry>Class template <code>polymorphic_allocator</code></entry>
1352 <entry>23.12.4</entry>
1353 <entry>Access to program-wide <code>memory_resource</code> objects</entry>
1358 <entry>23.12.5</entry>
1359 <entry>Pool resource classes</entry>
1364 <entry>23.12.6</entry>
1365 <entry>Class <code>monotonic_buffer_resource</code></entry>
1370 <entry>23.13</entry>
1371 <entry>Class template <code>scoped_allocator_adaptor</code></entry>
1376 <entry>23.14</entry>
1377 <entry>Function objects</entry>
1382 <entry>23.14.1</entry>
1383 <entry>Header <code><functional></code> synopsis</entry>
1388 <entry>23.14.2</entry>
1389 <entry>Definitions</entry>
1394 <entry>23.14.3</entry>
1395 <entry>Requirements</entry>
1400 <entry>23.14.4</entry>
1401 <entry>Function template <code>invoke</code></entry>
1406 <entry>23.14.5</entry>
1407 <entry>Class template <code>reference_wrapper</code></entry>
1412 <entry>23.14.6</entry>
1413 <entry>Arithmetic operation</entry>
1418 <entry>23.14.7</entry>
1419 <entry>Comparisons</entry>
1424 <entry>23.14.8</entry>
1425 <entry>Logical operations</entry>
1430 <entry>23.14.9</entry>
1431 <entry>Bitwise operations</entry>
1436 <entry>23.14.10</entry>
1437 <entry>Function template <code>not_fn</code></entry>
1442 <entry>23.14.11</entry>
1443 <entry>Function object binders</entry>
1448 <entry>23.14.12</entry>
1449 <entry>Function template <code>mem_fn</code></entry>
1454 <entry>23.14.13</entry>
1455 <entry>Polymorphic function wrappers</entry>
1460 <entry>23.14.14</entry>
1461 <entry>Searchers</entry>
1466 <entry>23.14.15</entry>
1467 <entry>Class template <code>hash</code></entry>
1472 <entry>23.15</entry>
1473 <entry>Metaprogramming and type traits</entry>
1478 <entry>23.15.1</entry>
1479 <entry>Requirements</entry>
1484 <entry>23.15.2</entry>
1485 <entry>Header <code><type_traits></code> synopsis</entry>
1490 <entry>23.15.3</entry>
1491 <entry>Helper classes</entry>
1496 <entry>23.15.4</entry>
1497 <entry>Unary Type Traits</entry>
1502 <entry>23.15.5</entry>
1503 <entry>Type property queries</entry>
1508 <entry>23.15.6</entry>
1509 <entry>Relationships between types</entry>
1514 <entry>23.15.7</entry>
1515 <entry>Transformations between types</entry>
1520 <entry>23.15.8</entry>
1521 <entry>Logical operator traits</entry>
1526 <entry>23.16</entry>
1527 <entry>Compile-time rational arithmetic</entry>
1532 <entry>23.17.1</entry>
1533 <entry>In general</entry>
1538 <entry>23.17.2</entry>
1539 <entry>Header <code><chrono></code> synopsis</entry>
1544 <entry>23.17</entry>
1545 <entry>Time utilities</entry>
1550 <entry>23.17.3</entry>
1551 <entry>Clock requirements</entry>
1556 <entry>23.17.4</entry>
1557 <entry>Time-related traits</entry>
1562 <entry>23.17.5</entry>
1563 <entry>Class template <code>duration</code></entry>
1568 <entry>23.17.6</entry>
1569 <entry>Class template <code>time_point</code></entry>
1574 <entry>23.17.7</entry>
1575 <entry>Clocks</entry>
1580 <entry>23.17.8</entry>
1581 <entry>Header <code><ctime></code> synopsis</entry>
1586 <entry>23.18</entry>
1587 <entry>Class <code>type_index</code></entry>
1592 <entry>23.19</entry>
1593 <entry>Execution policies</entry>
1598 <entry>23.19.1</entry>
1599 <entry>In general</entry>
1604 <entry>23.19.2</entry>
1605 <entry>Header <code><execution></code> synopsis</entry>
1610 <entry>23.19.3</entry>
1611 <entry>Execution policy type trait</entry>
1616 <entry>23.19.4</entry>
1617 <entry>Sequenced execution policy</entry>
1622 <entry>23.19.5</entry>
1623 <entry>Parallel execution policy</entry>
1628 <entry>23.19.6</entry>
1629 <entry>Parallel and unsequenced execution policy</entry>
1634 <entry>23.19.7</entry>
1635 <entry>Execution policy objects</entry>
1641 <emphasis>24</emphasis>
1643 <entry namest="c2" nameend="c4" align="left">
1644 <emphasis>Strings</emphasis>
1649 <entry>General</entry>
1655 <entry>Character traits</entry>
1661 <entry>String classes</entry>
1667 <entry>String view classes</entry>
1672 <entry>24.4.1</entry>
1673 <entry>Header <code><string_view></code> synopsis</entry>
1678 <entry>24.4.2</entry>
1679 <entry>Class template <code>basic_string_view</code></entry>
1684 <entry>24.4.3</entry>
1685 <entry>Non-member comparison functions</entry>
1690 <entry>24.4.4</entry>
1691 <entry>Inserters and extractors</entry>
1696 <entry>24.4.5</entry>
1697 <entry>Hash support</entry>
1702 <entry>24.4.6</entry>
1703 <entry>Suffix for <code>basic_string_view</code> literals</entry>
1708 <?dbhtml bgcolor="#B0B0B0" ?>
1710 <entry>Null-terminated sequence utilities</entry>
1711 <entry>Partial</entry>
1712 <entry>C library dependency. </entry>
1716 <emphasis>25</emphasis>
1718 <entry namest="c2" nameend="c4" align="left">
1719 <emphasis>Localization</emphasis>
1724 <entry>General</entry>
1730 <entry>Header <code><locale></code> synopsis</entry>
1736 <entry>Locales</entry>
1742 <entry>Standard <code>locale</code> categories</entry>
1748 <entry>C Library Locales</entry>
1754 <emphasis>26</emphasis>
1756 <entry namest="c2" nameend="c4" align="left">
1757 <emphasis>Containers</emphasis>
1762 <entry>General</entry>
1768 <entry>Container requirements</entry>
1774 <entry>Sequence containers</entry>
1780 <entry>Associative containers</entry>
1786 <entry>Unordered associative containers</entry>
1792 <entry>Container adaptors</entry>
1798 <emphasis>27</emphasis>
1800 <entry namest="c2" nameend="c4" align="left">
1801 <emphasis>Iterators</emphasis>
1806 <entry>General</entry>
1812 <entry>Iterator requirements</entry>
1818 <entry>Header <code><iterator></code> synopsis</entry>
1824 <entry>Iterator primitives</entry>
1830 <entry>Iterator adaptors</entry>
1836 <entry>Stream iterators</entry>
1842 <entry>Range access</entry>
1848 <entry>Container access</entry>
1854 <emphasis>28</emphasis>
1856 <entry namest="c2" nameend="c4" align="left">
1857 <emphasis>Algorithms</emphasis>
1862 <entry>General</entry>
1868 <entry>Header <code><algorithm></code> synopsis</entry>
1874 <entry>Algorithms requirements</entry>
1880 <entry>Parallel algorithms</entry>
1882 <entry>Using <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://github.com/llvm/llvm-project/tree/main/pstl">PSTL</link></entry>
1886 <entry>Non-modifying sequence operations</entry>
1892 <entry>Mutating sequence operations</entry>
1898 <entry>Sorting and related operations</entry>
1904 <entry>C library algorithms</entry>
1910 <emphasis>29</emphasis>
1912 <entry namest="c2" nameend="c4" align="left">
1913 <emphasis>Numerics</emphasis>
1918 <entry>General</entry>
1924 <entry>Definitions</entry>
1930 <entry>Numeric type requirements</entry>
1936 <entry>The floating-point environment</entry>
1942 <entry>Complex numbers</entry>
1948 <entry>Random number generation</entry>
1954 <entry>Numeric arrays</entry>
1960 <entry>Generalized numeric operations</entry>
1965 <entry>29.8.1</entry>
1966 <entry>Header <code><numeric></code> synopsis</entry>
1971 <entry>29.8.2</entry>
1972 <entry>Accumulate</entry>
1977 <entry>29.8.3</entry>
1978 <entry>Reduce</entry>
1983 <entry>29.8.4</entry>
1984 <entry>Inner product</entry>
1989 <entry>29.8.5</entry>
1990 <entry>Transform reduce</entry>
1995 <entry>29.8.6</entry>
1996 <entry>Partial sum</entry>
2001 <entry>29.8.7</entry>
2002 <entry>Exclusive scan</entry>
2007 <entry>29.8.8</entry>
2008 <entry>Inclusive scan</entry>
2013 <entry>29.8.9</entry>
2014 <entry>Transform exclusive scan</entry>
2019 <entry>29.8.10</entry>
2020 <entry>Transform inclusive scan</entry>
2025 <entry>29.8.11</entry>
2026 <entry>Adjacent difference</entry>
2031 <entry>29.8.12</entry>
2037 <entry>29.8.13</entry>
2038 <entry>Greatest common divisor</entry>
2043 <entry>29.8.14</entry>
2044 <entry>Least common multiple</entry>
2050 <entry>Mathematical functions for floating-point types</entry>
2055 <entry>29.9.1</entry>
2056 <entry>Header <code><cmath></code> synopsis</entry>
2061 <entry>29.9.2</entry>
2062 <entry>Absolute values</entry>
2067 <entry>29.9.3</entry>
2068 <entry>Three-dimensional hypotenuse</entry>
2073 <entry>29.9.4</entry>
2074 <entry>Classification / comparison functions</entry>
2079 <entry>29.9.5</entry>
2080 <entry>Mathematical special functions</entry>
2086 <emphasis>30</emphasis>
2088 <entry namest="c2" nameend="c4" align="left">
2089 <emphasis>Input/output library</emphasis>
2094 <entry>General</entry>
2100 <entry>Iostreams requirements</entry>
2105 <entry>30.2.1</entry>
2106 <entry>Imbue Limitations</entry>
2111 <entry>30.2.2</entry>
2112 <entry>Positioning Type Limitations</entry>
2117 <?dbhtml bgcolor="#B0B0B0" ?>
2118 <entry>30.2.3</entry>
2119 <entry>Thread safety</entry>
2120 <entry>Partial</entry>
2125 <entry>Forward declarations</entry>
2131 <entry>Standard iostream objects</entry>
2137 <entry>Iostreams base classes</entry>
2143 <entry>Stream buffers</entry>
2149 <entry>Formatting and manipulators</entry>
2155 <entry>String-based streams</entry>
2161 <entry>File-based streams</entry>
2166 <entry>30.10</entry>
2167 <entry>File systemss</entry>
2172 <entry>30.11</entry>
2173 <entry>C library files</entry>
2179 <emphasis>31</emphasis>
2181 <entry namest="c2" nameend="c4" align="left">
2182 <emphasis>Regular expressions</emphasis>
2187 <entry>General</entry>
2193 <entry>Definitions</entry>
2199 <entry>Requirements</entry>
2205 <entry>Header <code><regex></code> synopsis</entry>
2211 <entry>Namespace <code>std::regex_constants</code></entry>
2217 <entry>Class <code>regex_error</code></entry>
2222 <?dbhtml bgcolor="#B0B0B0" ?>
2224 <entry>Class template <code>regex_traits</code></entry>
2225 <entry>Partial</entry>
2226 <entry><code>transform_primary</code> is not correctly implemented</entry>
2230 <entry>Class template <code>basic_regex</code></entry>
2236 <entry>Class template <code>sub_match</code></entry>
2241 <entry>31.10</entry>
2242 <entry>Class template <code>match_results</code></entry>
2247 <entry>31.11</entry>
2248 <entry>Regular expression algorithms</entry>
2253 <entry>31.12</entry>
2254 <entry>Regular expression Iterators</entry>
2259 <entry>31.13</entry>
2260 <entry>Modified ECMAScript regular expression grammar</entry>
2266 <emphasis>32</emphasis>
2268 <entry namest="c2" nameend="c4" align="left">
2269 <emphasis>Atomic operations</emphasis>
2274 <entry>General</entry>
2280 <entry>Header <code><atomic></code> synopsis</entry>
2286 <entry>Type aliases</entry>
2292 <entry>Order and consistency</entry>
2298 <entry>Lock-free property</entry>
2304 <entry>Class template <code><atomic></code></entry>
2310 <entry>Non-member functions</entry>
2316 <entry>Flag Type and operations</entry>
2322 <entry>Fences</entry>
2328 <emphasis>33</emphasis>
2330 <entry namest="c2" nameend="c4" align="left">
2331 <emphasis>Thread support</emphasis>
2336 <entry>General</entry>
2342 <entry>Requirements</entry>
2348 <entry>Threads</entry>
2353 <entry>33.3.1</entry>
2354 <entry>Header <code>thread</code> synopsis</entry>
2359 <entry>33.3.2</entry>
2360 <entry>Class <code>thread</code></entry>
2365 <?dbhtml bgcolor="#B0B0B0" ?>
2366 <entry>33.3.2.1</entry>
2367 <entry>Class <code>thread</code></entry>
2368 <entry>Partial</entry>
2369 <entry><code>thread::id</code> comparisons not well-defined</entry>
2372 <entry>33.3.3</entry>
2373 <entry>Namespace <code>this_thread</code></entry>
2379 <entry>Mutual exclusion</entry>
2384 <entry>33.4.3</entry>
2385 <entry>Mutex requirements</entry>
2390 <entry>33.4.3.1</entry>
2391 <entry>In general</entry>
2396 <entry>33.4.3.2</entry>
2397 <entry>Mutex types</entry>
2402 <entry>33.4.3.2.1</entry>
2403 <entry>Class <code>mutex</code></entry>
2408 <entry>33.4.3.2.2</entry>
2409 <entry>Class <code>recursive_mutex</code></entry>
2414 <entry>33.4.3.3</entry>
2415 <entry>Timed mutex types</entry>
2420 <entry>33.4.3.3.1</entry>
2421 <entry>Class <code>timed_mutex</code></entry>
2426 <entry>33.4.3.3.2</entry>
2427 <entry>Class <code>recursive_timed_mutex</code></entry>
2432 <entry>33.4.3.4</entry>
2433 <entry>Shared mutex types</entry>
2438 <entry>33.4.3.4.1</entry>
2439 <entry>Class <code>shared_mutex</code></entry>
2444 <entry>33.4.3.5</entry>
2445 <entry>Shared timed mutex types</entry>
2450 <entry>33.4.3.5.1</entry>
2451 <entry>Class <code>shared_timed_mutex</code></entry>
2456 <entry>33.4.4</entry>
2457 <entry>Locks</entry>
2462 <entry>33.4.4.1</entry>
2463 <entry>Class template <code>lock_guard</code></entry>
2468 <entry>33.4.4.2</entry>
2469 <entry>Class template <code>scoped_guard</code></entry>
2474 <entry>33.4.4.3</entry>
2475 <entry>Class template <code>unique_lock</code></entry>
2480 <entry>33.4.4.4</entry>
2481 <entry>Class template <code>shared_lock</code></entry>
2486 <entry>33.4.5</entry>
2487 <entry>Generic locking algorithms</entry>
2492 <entry>33.4.6</entry>
2493 <entry>Call once</entry>
2498 <entry>33.4.6.1</entry>
2499 <entry>Struct <code>once_flag</code></entry>
2504 <?dbhtml bgcolor="#B0B0B0" ?>
2505 <entry>33.4.6.2</entry>
2506 <entry>Function <code>call_once</code></entry>
2508 <entry>Exception support is broken.
2509 See <link xmlns:xlink="http://www.w3.org/1999/xlink"
2510 xlink:href="https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66146">PR
2516 <entry>Condition variables</entry>
2521 <entry>33.5.1</entry>
2522 <entry>Class <code>condition_variable</code></entry>
2527 <entry>33.5.2</entry>
2528 <entry>Class <code>condition_variable_any</code></entry>
2534 <entry>Futures</entry>
2539 <entry>33.6.1</entry>
2540 <entry>Overview</entry>
2545 <entry>33.6.2</entry>
2546 <entry>Header <code><future></code></entry>
2551 <entry>33.6.3</entry>
2552 <entry>Error handling</entry>
2557 <entry>33.6.4</entry>
2558 <entry>Class <code>future_error</code></entry>
2563 <entry>33.6.5</entry>
2564 <entry>Shared state</entry>
2569 <entry>33.6.6</entry>
2570 <entry>Class template <code>promise</code></entry>
2575 <entry>33.6.7</entry>
2576 <entry>Class template <code>future</code></entry>
2581 <entry>33.6.8</entry>
2582 <entry>Class template <code>shared_future</code></entry>
2587 <entry>33.6.9</entry>
2588 <entry>Function template <code>async</code></entry>
2593 <entry>33.6.10</entry>
2594 <entry>Class template <code>packaged_task</code></entry>
2600 <emphasis>Appendix D</emphasis>
2602 <entry namest="c2" nameend="c4" align="left">
2603 <emphasis>Compatibility features</emphasis>
2608 <entry>C++ standard library headers</entry>
2613 <entry>D.4.1</entry>
2614 <entry>Header <code><ccomplex></code> synopsis</entry>
2619 <entry>D.4.1</entry>
2620 <entry>Header <code><cstdalign></code> synopsis</entry>
2625 <entry>D.4.1</entry>
2626 <entry>Header <code><cstdbool></code> synopsis</entry>
2631 <entry>D.4.1</entry>
2632 <entry>Header <code><ctgmath></code> synopsis</entry>
2638 <entry>C standard library headers</entry>
2644 <entry><code>char*</code> streams</entry>
2650 <entry><code>uncaught_exception</code></entry>
2656 <entry>Old adaptable function bindings</entry>
2662 <entry>The default allocator</entry>
2668 <entry>Raw storage iterator</entry>
2674 <entry>Temporary buffers</entry>
2680 <entry>Deprecated type traits</entry>
2686 <entry>Deprecated iterator primitives</entry>
2692 <entry>Deprecated <code>shared_ptr</code> observers</entry>
2698 <entry>Deprecated standard code conversion facets</entry>
2704 <entry>Deprecated convenience conversion interfaces</entry>
2713 <table frame="all" xml:id="table.cxx17_ts_status">
2714 <title>C++ Technical Specifications Implementation Status</title>
2716 <tgroup cols="4" align="left" colsep="0" rowsep="1">
2717 <colspec colname="c1"/>
2718 <colspec colname="c2"/>
2719 <colspec colname="c3"/>
2720 <colspec colname="c4"/>
2723 <entry>Paper</entry>
2724 <entry>Title</entry>
2725 <entry>Status</entry>
2726 <entry>Comments</entry>
2734 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/JTC1/SC22/WG21/docs/papers/2014/n4076.html">
2738 <entry>A generalized callable negator</entry>
2740 <entry>Library Fundamentals 2 TS</entry>
2745 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/JTC1/SC22/WG21/docs/papers/2014/n4273.htm">
2749 <entry>Uniform Container Erasure</entry>
2751 <entry>Library Fundamentals 2 TS</entry>
2756 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4061.pdf">
2760 <entry>Greatest Common Divisor and Least Common Multiple</entry>
2762 <entry>Library Fundamentals 2 TS</entry>
2767 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4066.htm">
2771 <entry>Delimited iterators</entry>
2773 <entry>Library Fundamentals 2 TS</entry>
2778 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4282.pdf">
2782 <entry>The World's Dumbest Smart Pointer</entry>
2784 <entry>Library Fundamentals 2 TS</entry>
2790 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4388.html">
2794 <entry>Const-Propagating Wrapper</entry>
2796 <entry>Library Fundamentals 2 TS</entry>
2801 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4391.html">
2805 <entry> <code>make_array</code>, revision 4 </entry>
2807 <entry>Library Fundamentals 2 TS</entry>
2812 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4502.pdf">
2816 <entry> Support for the C++ Detection Idiom, V2 </entry>
2818 <entry>Library Fundamentals 2 TS</entry>
2823 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4519.pdf">
2827 <entry> Source-Code Information Capture </entry>
2829 <entry>Library Fundamentals 2 TS</entry>
2833 <?dbhtml bgcolor="#C8B0B0" ?>
2835 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4521.html">
2839 <entry> Merge Fundamentals V1 into V2 </entry>
2841 N (components from V1 are still in namespace
2842 <code>fundamentals_v1</code>)
2844 <entry>Library Fundamentals 2 TS</entry>
2849 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/JTC1/SC22/WG21/docs/papers/2015/p0013r1.html">
2853 <entry>Logical Operator Type Traits (revision 1)</entry>
2855 <entry>Library Fundamentals 2 TS</entry>
2860 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4531.html">
2864 <entry>std::rand replacement, revision 3</entry>
2866 <entry>Library Fundamentals 2 TS</entry>
2871 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0214r9.pdf">
2875 <entry>Data-Parallel Types</entry>
2877 <entry>Parallelism 2 TS</entry>
2884 <section xml:id="iso.2017.specific" xreflabel="Implementation Specific"><info><title>Implementation Specific Behavior</title></info>
2886 <para>For behaviour which is also specified by previous standards,
2887 see <link linkend="iso.1998.specific">C++ 1998/2003 Implementation
2888 Specific Behavior</link> and <link linkend="iso.2011.specific">C++
2889 2011 Implementation Specific Behavior</link>. This section only
2890 documents behaviour which is new in the 2017 standard.
2894 <emphasis>20.5.1.2 [headers]</emphasis>
2895 Whether names from Annex K are declared by C++ headers depends on
2896 whether the underlying C library supports Annex K and declares the
2897 names. For the GNU C library, there is no Annex K support and so
2898 none of its names are declared by C++ headers.
2902 <emphasis>23.6.5 [optional.bad_optional_access]</emphasis>
2903 <code>what()</code> returns <literal>"bad optional access"</literal>.
2907 <emphasis>23.7.3 [variant.variant]</emphasis>
2908 <classname>variant</classname> supports over-aligned types.
2912 <emphasis>23.7.10 [variant.bad.access]</emphasis>
2913 <code>what()</code> returns one of the strings
2914 <literal>"std::get: variant is valueless"</literal>,
2915 <literal>"std::get: wrong index for variant"</literal>,
2916 <literal>"std::visit: variant is valueless"</literal>,
2917 or <literal>"std::visit<R>: variant is valueless"</literal>.
2921 <emphasis>23.12.5.2 [memory.resource.pool.options]</emphasis>
2922 Let S equal <code>numeric_limits<size_t>::digits</code>.
2923 The limit for maximum number of blocks in a chunk is given by
2924 <inlineequation><mathphrase>2<superscript>N</superscript>-1</mathphrase></inlineequation>,
2925 where N is <inlineequation><mathphrase>min(19, 3 + S/2)</mathphrase></inlineequation>.
2926 The largest allocation size that will be allocated from a pool is
2927 <inlineequation><mathphrase>2<superscript>22</superscript></mathphrase></inlineequation>
2928 when <inlineequation><mathphrase>S > 20</mathphrase></inlineequation>,
2929 otherwise 3072 when <inlineequation><mathphrase>S > 16</mathphrase></inlineequation>,
2934 <emphasis>23.12.6.1 [memory.resource.monotonic.buffer.ctor]</emphasis>
2935 The default <code>next_buffer_size</code> is <code>128 * sizeof(void*)</code>.
2936 The default growth factor is <code>1.5</code>.
2940 <emphasis>23.15.4.3 [meta.unary.prop]</emphasis>
2941 The predicate condition for
2942 <code>has_unique_object_representations</code> is true for all scalar
2943 types except floating point types.
2947 <emphasis>23.19.3 [execpol.type],
2948 28.4.3 [algorithms.parallel.exec]</emphasis>
2949 There are no implementation-defined execution policies.
2953 <emphasis>24.4.2 [string.view.template]</emphasis>
2954 <classname>basic_string_view<C, T>::iterator</classname> is
2956 <classname>basic_string_view<C, T>::const_iterator</classname> is
2957 <code>const C*</code>.
2962 <emphasis>28.4.3 [algorithms.parallel.exec]</emphasis>
2963 Threads of execution created by <classname>std::thread</classname>
2964 provide concurrent forward progress guarantees, so threads of execution
2965 implicitly created by the library will provide parallel forward
2966 progress guarantees.
2970 <emphasis>29.4.1 [cfenv.syn]</emphasis>
2971 The effects of the <filename><cfenv></filename> functions
2972 depends on whether the <code>FENV_ACCESS</code> pragma is supported,
2973 and on the C library that provides the header.
2977 <emphasis>29.6.9 [c.math.rand]</emphasis>
2978 Whether the <function>rand</function> function may introduce data
2979 races depends on the target C library that provides the function.
2983 <emphasis>29.9.5 [sf.cmath]</emphasis>
2984 The effect of calling the mathematical special functions with large
2985 inputs should be documented here.
2989 <emphasis>30.10.2.1 [fs.conform.9945]</emphasis>
2990 The behavior of the filesystem library implementation will depend on
2991 the target operating system. Some features will not be supported
2992 on some targets. Symbolic links and file permissions
2993 are not supported on Windows.
2997 <emphasis>30.10.5 [fs.filesystem.syn]</emphasis>
2998 The clock used for file times is an unspecified type
2999 with a signed 64-bit representation, capable of representing
3000 timestamps with nanosecond resolution. The clock's epoch is
3001 unspecified, but is not the same as the system clock's epoch.
3005 <emphasis>30.10.7.1 [fs.path.generic]</emphasis>
3006 dot-dot in the root-directory refers to the root-directory itself.
3007 On Windows, a drive specifier such as <code>"C:"</code> or
3008 <code>"z:"</code> is treated as a root-name. On Cygwin, a path
3009 that begins with two successive directory separators is a
3010 root-name. Otherwise (for POSIX-like systems other than Cygwin),
3011 the implementation-defined root-name is an unspecified string
3012 which does not appear in any pathnames.
3016 <emphasis>30.10.10.1 [fs.enum.path.format]</emphasis>
3017 The character sequence is always interpreted in the native pathname
3022 <emphasis>30.10.15.4 [fs.op.file_size]</emphasis>
3023 If <code>!is_regular_file(p)</code>, an error is reported.
3027 <emphasis>30.10.15.32 [fs.op.rename]</emphasis>
3028 On Windows, <code>filesystem::rename</code>
3029 is implemented by calling <code>MoveFileExW</code> and so
3030 does not meet the requirements of POSIX <code>rename</code>
3031 when one or both of the paths resolves to an existing directory.
3032 Specifically, it is not possible to rename a directory to replace another
3033 directory (POSIX requires that to work if the directory being
3038 <section xml:id="iso.2017.par2ts" xreflabel="Implementation Specific Behavior of the Parallelism 2 TS"><info><title>Parallelism 2 TS</title></info>
3041 <emphasis>9.3 [parallel.simd.abi]</emphasis>
3042 <code>max_fixed_size<T></code> is 32, except when targetting
3043 AVX512BW and <code>sizeof(T)</code> is 1.
3047 When targeting 32-bit x86,
3048 <classname>simd_abi::compatible<T></classname> is an alias for
3049 <classname>simd_abi::scalar</classname>.
3050 When targeting 64-bit x86 (including x32) or Aarch64,
3051 <classname>simd_abi::compatible<T></classname> is an alias for
3052 <classname>simd_abi::_VecBuiltin<16></classname>,
3053 unless <code>T</code> is <code>long double</code>, in which case it is
3054 an alias for <classname>simd_abi::scalar</classname>.
3055 When targeting ARM (but not Aarch64) with NEON support,
3056 <classname>simd_abi::compatible<T></classname> is an alias for
3057 <classname>simd_abi::_VecBuiltin<16></classname>,
3058 unless <code>sizeof(T) > 4</code>, in which case it is
3059 an alias for <classname>simd_abi::scalar</classname>. Additionally,
3060 <classname>simd_abi::compatible<float></classname> is an alias for
3061 <classname>simd_abi::scalar</classname> unless compiling with
3066 When targeting x86 (both 32-bit and 64-bit),
3067 <classname>simd_abi::native<T></classname> is an alias for one of
3068 <classname>simd_abi::scalar</classname>,
3069 <classname>simd_abi::_VecBuiltin<16></classname>,
3070 <classname>simd_abi::_VecBuiltin<32></classname>, or
3071 <classname>simd_abi::_VecBltnBtmsk<64></classname>, depending on
3072 <code>T</code> and the machine options the compiler was invoked with.
3076 When targeting ARM/Aarch64 or POWER,
3077 <classname>simd_abi::native<T></classname> is an alias for
3078 <classname>simd_abi::scalar</classname> or
3079 <classname>simd_abi::_VecBuiltin<16></classname>, depending on
3080 <code>T</code> and the machine options the compiler was invoked with.
3084 For any other targeted machine
3085 <classname>simd_abi::compatible<T></classname> and
3086 <classname>simd_abi::native<T></classname> are aliases for
3087 <classname>simd_abi::scalar</classname>. (subject to change)
3091 The extended ABI tag types defined in the
3092 <code>std::experimental::parallelism_v2::simd_abi</code> namespace are:
3093 <classname>simd_abi::_VecBuiltin<Bytes></classname>, and
3094 <classname>simd_abi::_VecBltnBtmsk<Bytes></classname>.
3098 <classname>simd_abi::deduce<T, N, Abis...>::type</classname>,
3099 with <code>N > 1</code> is an alias for an extended ABI tag, if a
3100 supported extended ABI tag exists. Otherwise it is an alias for
3101 <classname>simd_abi::fixed_size<N></classname>. The <classname>
3102 simd_abi::_VecBltnBtmsk</classname> ABI tag is preferred over
3103 <classname>simd_abi::_VecBuiltin</classname>.
3107 <emphasis>9.4 [parallel.simd.traits]</emphasis>
3108 <classname>memory_alignment<T, U>::value</classname> is
3109 <code>sizeof(U) * T::size()</code> rounded up to the next power-of-two
3114 <emphasis>9.6.1 [parallel.simd.overview]</emphasis>
3115 On ARM, <classname>simd<T, _VecBuiltin<Bytes>></classname>
3116 is supported if <code>__ARM_NEON</code> is defined and
3117 <code>sizeof(T) <= 4</code>. Additionally,
3118 <code>sizeof(T) == 8</code> with integral <code>T</code> is supported if
3119 <code>__ARM_ARCH >= 8</code>, and <code>double</code> is supported if
3120 <code>__aarch64__</code> is defined.
3122 On POWER, <classname>simd<T, _VecBuiltin<Bytes>></classname>
3123 is supported if <code>__ALTIVEC__</code> is defined and <code>sizeof(T)
3124 < 8</code>. Additionally, <code>double</code> is supported if
3125 <code>__VSX__</code> is defined, and any <code>T</code> with <code>
3126 sizeof(T) <= 8</code> is supported if <code>__POWER8_VECTOR__</code>
3129 On x86, given an extended ABI tag <code>Abi</code>,
3130 <classname>simd<T, Abi></classname> is supported according to the
3132 <table frame="all" xml:id="table.par2ts_simd_support">
3133 <title>Support for Extended ABI Tags</title>
3135 <tgroup cols="4" align="left" colsep="0" rowsep="1">
3136 <colspec colname="c1"/>
3137 <colspec colname="c2"/>
3138 <colspec colname="c3"/>
3139 <colspec colname="c4"/>
3142 <entry>ABI tag <code>Abi</code></entry>
3143 <entry>value type <code>T</code></entry>
3144 <entry>values for <code>Bytes</code></entry>
3145 <entry>required machine option</entry>
3151 <entry morerows="5">
3152 <classname>_VecBuiltin<Bytes></classname>
3154 <entry morerows="1"><code>float</code></entry>
3155 <entry>8, 12, 16</entry>
3156 <entry>"-msse"</entry>
3160 <entry>20, 24, 28, 32</entry>
3161 <entry>"-mavx"</entry>
3165 <entry morerows="1"><code>double</code></entry>
3167 <entry>"-msse2"</entry>
3171 <entry>24, 32</entry>
3172 <entry>"-mavx"</entry>
3176 <entry morerows="1">
3177 integral types other than <code>bool</code>
3180 <code>Bytes</code> ≤ 16 and <code>Bytes</code> divisible by
3181 <code>sizeof(T)</code>
3183 <entry>"-msse2"</entry>
3188 16 < <code>Bytes</code> ≤ 32 and <code>Bytes</code>
3189 divisible by <code>sizeof(T)</code>
3191 <entry>"-mavx2"</entry>
3195 <entry morerows="1">
3196 <classname>_VecBuiltin<Bytes></classname> and
3197 <classname>_VecBltnBtmsk<Bytes></classname>
3200 vectorizable types with <code>sizeof(T)</code> ≥ 4
3202 <entry morerows="1">
3203 32 < <code>Bytes</code> ≤ 64 and <code>Bytes</code>
3204 divisible by <code>sizeof(T)</code>
3206 <entry>"-mavx512f"</entry>
3211 vectorizable types with <code>sizeof(T)</code> < 4
3213 <entry>"-mavx512bw"</entry>
3217 <entry morerows="1">
3218 <classname>_VecBltnBtmsk<Bytes></classname>
3221 vectorizable types with <code>sizeof(T)</code> ≥ 4
3223 <entry morerows="1">
3224 <code>Bytes</code> ≤ 32 and <code>Bytes</code> divisible by
3225 <code>sizeof(T)</code>
3227 <entry>"-mavx512vl"</entry>
3232 vectorizable types with <code>sizeof(T)</code> < 4
3234 <entry>"-mavx512bw" and "-mavx512vl"</entry>