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"?> 4 5<info><title>C++ 2017</title> 6 <keywordset> 7 <keyword>ISO C++</keyword> 8 <keyword>2017</keyword> 9 </keywordset> 10</info> 11 12<para> 13In this implementation the <literal>-std=gnu++17</literal> or 14<literal>-std=c++17</literal> flag must be used to enable language 15and library 16features. See <link linkend="manual.intro.using.flags">dialect</link> 17options. The pre-defined symbol 18<constant>__cplusplus</constant> is used to check for the 19presence of the required flag. 20</para> 21 22<para> 23This section describes the C++17 and library TS support in the GCC 9 series. 24</para> 25 26<para> 27The following table lists new library features that are included in 28the C++17 standard. The "Proposal" column provides a link to the 29ISO C++ committee proposal that describes the feature, while the "Status" 30column indicates the first version of GCC that contains an implementation of 31this feature (if it has been implemented). 32The "SD-6 Feature Test" column shows the corresponding macro or header from 33<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: 34Feature-testing recommendations for C++</link>. 35</para> 36 37<table frame="all" xml:id="table.cxx17_status"> 38<title>C++ 2017 Implementation Status</title> 39 40<tgroup cols="4" align="left" colsep="0" rowsep="1"> 41<colspec colname="c1"/> 42<colspec colname="c2"/> 43<colspec colname="c3"/> 44<colspec colname="c4"/> 45 <thead> 46 <row> 47 <entry>Library Feature</entry> 48 <entry>Proposal</entry> 49 <entry>Status</entry> 50 <entry>SD-6 Feature Test</entry> 51 </row> 52 </thead> 53 54 <tbody> 55 56 <row> 57 <?dbhtml bgcolor="#C8B0B0" ?> 58 <entry> 59 <code>constexpr std::hardware_{constructive,destructive}_interference_size</code> 60 </entry> 61 <entry> 62 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0154r1.html"> 63 P0154R1 64 </link> 65 </entry> 66 <entry align="center"> No </entry> 67 <entry> <code>__cpp_lib_hardware_interference_size >= 201603</code> </entry> 68 </row> 69 70 <row> 71 <entry> Core Issue 1776: Replacement of class objects containing reference members</entry> 72 <entry> 73 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0137r1.html"> 74 P0137R1 75 </link> 76 </entry> 77 <entry align="center"> 7.1 </entry> 78 <entry> <code>__cpp_lib_launder >= 201606</code> </entry> 79 </row> 80 81 <row> 82 <entry>Wording for <code>std::uncaught_exceptions</code></entry> 83 <entry> 84 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/JTC1/sc22/WG21/docs/papers/2014/n4259.pdf"> 85 N4259 86 </link> 87 </entry> 88 <entry align="center">6.1</entry> 89 <entry><code>__cpp_lib_uncaught_exceptions >= 201411</code></entry> 90 </row> 91 92 <row> 93 <entry> C++17 should refer to C11 instead of C99 </entry> 94 <entry> 95 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0063r3.html"> 96 P0063R3 97 </link> 98 </entry> 99 <entry align="center"> 9.1 </entry> 100 <entry/> 101 </row> 102 103 <row> 104 <entry> Variant: a type-safe union for C++17 </entry> 105 <entry> 106 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0088r3.html"> 107 P0088R3 108 </link> 109 </entry> 110 <entry align="center"> 7.1 </entry> 111 <entry> <code>__has_include(<variant>)</code>, 112 <code>__cpp_lib_variant >= 201603</code> 113 (since 7.3, see Note 1) 114 </entry> 115 </row> 116 117 <row> 118 <entry> Library Fundamentals V1 TS Components: <code>optional</code> </entry> 119 <entry> 120 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0220r1.html"> 121 P0220R1 122 </link> 123 </entry> 124 <entry align="center"> 7.1 </entry> 125 <entry> <code>__has_include(<optional>)</code>, 126 <code>__cpp_lib_optional >= 201603</code> 127 (since 7.3, see Note 1) 128 </entry> 129 </row> 130 131 <row> 132 <entry> Library Fundamentals V1 TS Components: <code>any</code> </entry> 133 <entry> 134 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0220r1.html"> 135 P0220R1 136 </link> 137 </entry> 138 <entry align="center"> 7.1 </entry> 139 <entry> <code>__has_include(<any>)</code>, 140 <code>__cpp_lib_any >= 201603</code> 141 (since 7.3, see Note 1) 142 </entry> 143 </row> 144 145 <row> 146 <entry> Library Fundamentals V1 TS Components: <code>string_view</code> </entry> 147 <entry> 148 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0220r1.html"> 149 P0220R1 150 </link> 151 </entry> 152 <entry align="center"> 7.1 </entry> 153 <entry> <code>__has_include(<string_view>)</code>, 154 <code>__cpp_lib_string_view >= 201603</code> 155 (since 7.3, see Note 1) 156 </entry> 157 </row> 158 159 <row> 160 <entry> Library Fundamentals V1 TS Components: <code>memory_resource</code> </entry> 161 <entry> 162 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0220r1.html"> 163 P0220R1 164 </link> 165 </entry> 166 <entry align="center"> 9.1 </entry> 167 <entry> <code>__has_include(<memory_resource>)</code>, 168 <code>__cpp_lib_memory_resource >= 201603</code> 169 </entry> 170 </row> 171 172 <row> 173 <entry> Library Fundamentals V1 TS Components: <code>apply</code> </entry> 174 <entry> 175 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0220r1.html"> 176 P0220R1 177 </link> 178 </entry> 179 <entry align="center"> 7.1 </entry> 180 <entry> <code>__cpp_lib_apply >= 201603</code> </entry> 181 </row> 182 183 <row> 184 <entry> Library Fundamentals V1 TS Components: <code>shared_ptr<T[]></code> </entry> 185 <entry> 186 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0220r1.html"> 187 P0220R1 188 </link> 189 </entry> 190 <entry align="center"> 7.1 </entry> 191 <entry> <code>__cpp_lib_shared_ptr_arrays >= 201603</code> </entry> 192 </row> 193 194 <row> 195 <entry> Library Fundamentals V1 TS Components: Searchers </entry> 196 <entry> 197 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0220r1.html"> 198 P0220R1 199 </link> 200 </entry> 201 <entry align="center"> 7.1 </entry> 202 <entry> <code>__cpp_lib_boyer_moore_searcher >= 201603</code> </entry> 203 </row> 204 205 <row> 206 <entry> Library Fundamentals V1 TS Components: Sampling </entry> 207 <entry> 208 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0220r1.html"> 209 P0220R1 210 </link> 211 </entry> 212 <entry align="center"> 7.1 </entry> 213 <entry> <code>__cpp_lib_sample >= 201603</code> </entry> 214 </row> 215 216 <row> 217 <entry> Constant View: A proposal for a <code>std::as_const</code> helper function template </entry> 218 <entry> 219 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href=""> 220 P0007R1 221 </link> 222 </entry> 223 <entry align="center"> 7.1 </entry> 224 <entry><code> __cpp_lib_as_const >= 201510 </code></entry> 225 </row> 226 227 <row> 228 <entry> Improving pair and tuple </entry> 229 <entry> 230 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4387"> 231 N4387 232 </link> 233 </entry> 234 <entry align="center"> 6.1 </entry> 235 <entry> N/A </entry> 236 </row> 237 238 <row> 239 <entry> <code>make_from_tuple</code>: apply for construction </entry> 240 <entry> 241 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0209r2.pdf"> 242 P0209R2 243 </link> 244 </entry> 245 <entry align="center"> 7.1 </entry> 246 <entry><code> __cpp_lib_make_from_tuple >= 201606 </code></entry> 247 </row> 248 249 <row> 250 <?dbhtml bgcolor="#C8B0B0" ?> 251 <entry> 252 Removing <code>auto_ptr</code>, <code>random_shuffle()</code>, 253 And Old <code><functional></code> Stuff 254 </entry> 255 <entry> 256 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4190.htm"> 257 N4190 258 </link> 259 </entry> 260 <entry align="center">No (kept for backwards compatibility)</entry> 261 <entry/> 262 </row> 263 264 <row> 265 <?dbhtml bgcolor="#C8B0B0" ?> 266 <entry> Deprecating Vestigial Library Parts in C++17 </entry> 267 <entry> 268 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0174r2.html"> 269 P0174R2 270 </link> 271 </entry> 272 <entry align="center"> No (kept for backwards compatibility)</entry> 273 <entry/> 274 </row> 275 276 <row> 277 <entry> Making <code>std::owner_less</code> more flexible </entry> 278 <entry> 279 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0074r0.html"> 280 P0074R0 281 </link> 282 </entry> 283 <entry align="center"> 7.1 </entry> 284 <entry><code> __cpp_lib_transparent_operators >= 201510 </code></entry> 285 </row> 286 287 <row> 288 <entry> <code>std::addressof</code> should be constexpr </entry> 289 <entry> 290 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0304r0.html#2296"> 291 LWG2296 292 </link> 293 </entry> 294 <entry align="center"> 7.1 </entry> 295 <entry><code> __cpp_lib_addressof_constexpr >= 201603 </code></entry> 296 </row> 297 298 <row> 299 <entry> Safe conversions in <code>unique_ptr<T[]></code> </entry> 300 <entry> 301 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4089.pdf"> 302 N4089 303 </link> 304 </entry> 305 <entry align="center"> 6 </entry> 306 <entry/> 307 </row> 308 309 <row> 310 <entry> LWG 2228: Missing SFINAE rule in unique_ptr templated assignment </entry> 311 <entry> 312 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4366.html"> 313 N4366 314 </link> 315 </entry> 316 <entry align="center"> 6 </entry> 317 <entry/> 318 </row> 319 320 <row> 321 <entry> Re-enabling <code>shared_from_this</code></entry> 322 <entry> 323 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0033r1.html"> 324 P0033R1 325 </link> 326 </entry> 327 <entry align="center"> 7.1 </entry> 328 <entry><code>__cpp_lib_enable_shared_from_this >= 201603</code></entry> 329 </row> 330 331 <row> 332 <entry> A proposal to add <code>invoke</code> function template </entry> 333 <entry> 334 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4169.html"> 335 N4169 336 </link> 337 </entry> 338 <entry align="center"> 6.1 </entry> 339 <entry><code> __cpp_lib_invoke >= 201411 </code></entry> 340 </row> 341 342 <row> 343 <entry>TriviallyCopyable <code>reference_wrapper</code> </entry> 344 <entry> 345 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4277.html"> 346 N4277 347 </link> 348 </entry> 349 <entry align="center"> 5.1 </entry> 350 <entry/> 351 </row> 352 353 <row> 354 <entry> Adopt <code>not_fn</code> from Library Fundamentals 2 for C++17 </entry> 355 <entry> 356 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0005r4.html"> 357 P0005R4 358 </link> 359 </entry> 360 <entry align="center"> 7.1 </entry> 361 <entry><code>__cpp_lib_not_fn >= 201603</code></entry> 362 </row> 363 364 <row> 365 <entry> Fixes for <code>not_fn</code> </entry> 366 <entry> 367 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0358r1.html"> 368 P0358R1 369 </link> 370 </entry> 371 <entry align="center"> 7.1 </entry> 372 <entry/> 373 </row> 374 375 <row> 376 <entry> Fixing a design mistake in the searchers interface in Library Fundamentals </entry> 377 <entry> 378 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0253r1.pdf"> 379 P0253R1 380 </link> 381 </entry> 382 <entry align="center"> 7.1 </entry> 383 <entry/> 384 </row> 385 386 <row> 387 <entry> Extending memory management tools </entry> 388 <entry> 389 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0040r3.html"> 390 P0040R3 391 </link> 392 </entry> 393 <entry align="center"> 7.1 </entry> 394 <entry><code>__cpp_lib_raw_memory_algorithms >= 201606L</code></entry> 395 </row> 396 397 <row> 398 <entry> <code>shared_ptr::weak_type</code></entry> 399 <entry> 400 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0163r0.html"> 401 P0163R0 402 </link> 403 </entry> 404 <entry align="center"> 7.1 </entry> 405 <entry><code> __cpp_lib_shared_ptr_weak_type >= 201606</code></entry> 406 </row> 407 408 <row> 409 <entry>Transformation Trait Alias <code>void_t</code></entry> 410 <entry> 411 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/JTC1/sc22/WG21/docs/papers/2014/n3911.pdf"> 412 N3911 413 </link> 414 </entry> 415 <entry align="center">6.1</entry> 416 <entry><code> __cpp_lib_void_t >= 201411</code></entry> 417 </row> 418 419 <row> 420 <entry> Wording for <code>bool_constant</code>, revision 1 </entry> 421 <entry> 422 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4389.html"> 423 N4389 424 </link> 425 </entry> 426 <entry align="center">6.1</entry> 427 <entry><code> __cpp_lib_bool_constant >= 201505</code></entry> 428 </row> 429 430 <row> 431 <entry> Adopt Type Traits Variable Templates from Library Fundamentals TS for C++17</entry> 432 <entry> 433 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0006r0.html"> 434 P0006R0 435 </link> 436 </entry> 437 <entry align="center"> 7.1 </entry> 438 <entry><code> __cpp_lib_type_trait_variable_templates >= 201510 </code></entry> 439 </row> 440 441 <row> 442 <entry> Logical Operator Type Traits</entry> 443 <entry> 444 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0013r1.html"> 445 P0013R1 446 </link> 447 </entry> 448 <entry align="center"> 6.1 </entry> 449 <entry><code> __cpp_lib_logical_traits >= 201510 </code></entry> 450 </row> 451 452 <row> 453 <entry> Adding [nothrow-]swappable traits </entry> 454 <entry> 455 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0185r1.html"> 456 P0185R1 457 </link> 458 </entry> 459 <entry align="center"> 7 (<code>__is_swappable</code> available since 6.1)</entry> 460 <entry><code> __cpp_lib_is_swappable >= 201603 </code></entry> 461 </row> 462 463 <row> 464 <entry> <code>is_callable</code>, the missing INVOKE related trait</entry> 465 <entry> 466 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0077r2.html"> 467 P0077R2 468 </link> 469 </entry> 470 <entry align="center"> 7.1 </entry> 471 <entry><code> __cpp_lib_is_callable >= 201603 </code></entry> 472 </row> 473 474 <row> 475 <entry> has_unique_object_representations </entry> 476 <entry> 477 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0258r2.html"> 478 P0258R2 479 </link> 480 </entry> 481 <entry align="center"> 7.1 </entry> 482 <entry><code> __cpp_lib_has_unique_object_representations >= 201606 </code></entry> 483 </row> 484 485 <row> 486 <entry> Polishing <code><chrono></code> </entry> 487 <entry> 488 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0092r1.html"> 489 P0092R1 490 </link> 491 </entry> 492 <entry align="center"> 7.1 </entry> 493 <entry><code> __cpp_lib_chrono >= 201510 </code></entry> 494 </row> 495 496 <row> 497 <entry> Adding more constexpr to <code><chrono></code> </entry> 498 <entry> 499 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0505r0.html"> 500 P0505R0 501 </link> 502 </entry> 503 <entry align="center"> 7.1 </entry> 504 <entry><code> __cpp_lib_chrono >= 201611 </code> 505 (since 7.3, see Note 2) 506 </entry> 507 </row> 508 509 <row> 510 <entry> Constexpr for <code>std::char_traits</code> </entry> 511 <entry> 512 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0426r1.html"> 513 P0426R1 514 </link> 515 </entry> 516 <entry align="center"> 8.1 </entry> 517 <entry><code> __cpp_lib_constexpr_char_traits >= 201611 </code></entry> 518 </row> 519 520 <row> 521 <entry> Integrating <code>std::string_view</code> and <code>std::string</code> </entry> 522 <entry> 523 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0254r2.pdf"> 524 P0254R2 525 </link> 526 </entry> 527 <entry align="center"> 7.1 </entry> 528 <entry><code> </code></entry> 529 </row> 530 531 <row> 532 <entry> Give 'std::string' a non-const '.data()' member function </entry> 533 <entry> 534 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0272r1.html"> 535 P0272R1 536 </link> 537 </entry> 538 <entry align="center"> 7.1 </entry> 539 <entry><code> </code></entry> 540 </row> 541 542 <row> 543 <entry>Cleaning-up noexcept in the Library</entry> 544 <entry> 545 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4258.pdf"> 546 N4258 547 </link> 548 </entry> 549 <entry align="center">6.1</entry> 550 <entry><code> __cpp_lib_allocator_traits_is_always_equal >= 201411 </code></entry> 551 </row> 552 553 <row> 554 <entry>Contiguous Iterators </entry> 555 <entry> 556 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4284.html"> 557 N4284 558 </link> 559 </entry> 560 <entry align="center">N/A</entry> 561 <entry/> 562 </row> 563 564 <row> 565 <entry> Minimal incomplete type support for standard containers </entry> 566 <entry> 567 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4510.html"> 568 N4510 569 </link> 570 </entry> 571 <entry align="center"> 3.0 </entry> 572 <entry><code> __cpp_lib_incomplete_container_elements >= 201505 </code> 573 (since 6.2, see Note 2) 574 </entry> 575 </row> 576 577 <row> 578 <entry> Emplace return type </entry> 579 <entry> 580 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0084r2.pdf"> 581 P0084R2 582 </link> 583 </entry> 584 <entry align="center"> 7.1 </entry> 585 <entry/> 586 </row> 587 588 <row> 589 <entry>Improved insertion interface for unique-key maps</entry> 590 <entry> 591 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4279.html"> 592 N4279 593 </link> 594 </entry> 595 <entry align="center"> 6.1 </entry> 596 <entry><code> __cpp_lib_map_try_emplace >= 201411</code>, 597 <code> __cpp_lib_unordered_map_try_emplace >= 201411</code> 598 </entry> 599 </row> 600 601 <row> 602 <entry> Splicing Maps and Sets </entry> 603 <entry> 604 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0083r3.pdf"> 605 P0083R3 606 </link> 607 </entry> 608 <entry align="center"> 7.1 </entry> 609 <entry><code> __cpp_lib_node_extract >= 201606 </code></entry> 610 </row> 611 612 <row> 613 <entry>Non-member <code>size()</code> and more</entry> 614 <entry> 615 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4280.pdf"> 616 N4280 617 </link> 618 </entry> 619 <entry align="center"> 6.1 </entry> 620 <entry><code> __cpp_lib_nonmember_container_access >= 201411 </code></entry> 621 </row> 622 623 <row> 624 <entry> A Proposal to Add Constexpr Modifiers to <code>reverse_iterator</code>, <code>move_iterator</code>, <code>array</code> and Range Access </entry> 625 <entry> 626 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0031r0.html"> 627 P0031R0 628 </link> 629 </entry> 630 <entry align="center"> 7.1 </entry> 631 <entry><code> __cpp_lib_array_constexpr >= 201603 </code></entry> 632 </row> 633 634 <row> 635 <?dbhtml bgcolor="#B0B0B0" ?> 636 <entry> The Parallelism TS Should be Standardized </entry> 637 <entry> 638 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0024r2.html"> 639 P0024R2 640 </link> 641 </entry> 642 <entry align="center"> 9.1 </entry> 643 <entry><code> __has_include(<execution>) </code>, 644 <code> __cpp_lib_execution >= 201603 </code>, 645 <code> __cpp_lib_parallel_algorithm >= 201603 </code> 646 (requires linking with <code>-ltbb</code>, see Note 3) 647 </entry> 648 </row> 649 650 <row> 651 <entry> An algorithm to "clamp" a value between a pair of boundary values </entry> 652 <entry> 653 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0025r0.html"> 654 P0025R0 655 </link> 656 </entry> 657 <entry align="center"> 7.1 </entry> 658 <entry><code> __cpp_lib_clamp >= 201603 </code></entry> 659 </row> 660 661 <row> 662 <entry> Adopt Selected Library Fundamentals V2 Components for C++17 </entry> 663 <entry> 664 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0295r0.pdf"> 665 P0295R0 666 </link> 667 </entry> 668 <entry align="center"> 7.1 </entry> 669 <entry><code> __cpp_lib_gcd_lcm >= 201606 </code></entry> 670 </row> 671 672 <row> 673 <entry> Proposal to Introduce a 3-Argument Overload to <code>std::hypot</code> </entry> 674 <entry> 675 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0030r1.pdf"> 676 P0030R1 677 </link> 678 </entry> 679 <entry align="center"> 7.1 </entry> 680 <entry><code> __cpp_lib_hypot >= 201603 </code></entry> 681 </row> 682 683 <row> 684 <entry> Mathematical Special Functions for C++17 </entry> 685 <entry> 686 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0226r1.pdf"> 687 P0226R1 688 </link> 689 </entry> 690 <entry align="center"> 7.1 </entry> 691 <entry><code> __cpp_lib_math_special_functions >= 201603 </code> 692 (see Note 4) 693 </entry> 694 </row> 695 696 <row> 697 <entry>Adopt the File System TS for C++17 </entry> 698 <entry> 699 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0218r1.html"> 700 P0218R1 701 </link> 702 </entry> 703 <entry align="center"> 8.1 </entry> 704 <entry><code> __has_include(<filesystem>) </code>, 705 <code> __cpp_lib_filesystem >= 201603 </code> 706 (GCC 8.x requires linking with <code>-lstdc++fs</code>) 707 </entry> 708 </row> 709 710 <row> 711 <entry> Relative Paths for Filesystem</entry> 712 <entry> 713 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0219r1.html"> 714 P0219R1 715 </link> 716 </entry> 717 <entry align="center"> 8.1 </entry> 718 <entry><code> __cpp_lib_filesystem >= 201606 </code></entry> 719 </row> 720 721 <row> 722 <entry> Adapting string_view by filesystem paths </entry> 723 <entry> 724 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0392r0.pdf"> 725 P0392R0 726 </link> 727 </entry> 728 <entry align="center"> 8.1 </entry> 729 <entry><code> __cpp_lib_filesystem >= 201606 </code></entry> 730 </row> 731 732 <row> 733 <entry> Directory Entry Caching for Filesystem </entry> 734 <entry> 735 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0317r1.html"> 736 P0317R1 737 </link> 738 </entry> 739 <entry align="center"> 8.1 </entry> 740 <entry><code> __cpp_lib_filesystem >= 201703 </code></entry> 741 </row> 742 743 <row> 744 <entry> constexpr <code>atomic<T>::is_always_lock_free</code> </entry> 745 <entry> 746 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0152r1.html"> 747 P0152R1 748 </link> 749 </entry> 750 <entry align="center"> 7.1 </entry> 751 <entry><code> __cpp_lib_atomic_is_always_lock_free >= 201603 </code></entry> 752 </row> 753 754 <row> 755 <entry>A proposal to add <code>shared_mutex</code> (untimed) (Revision 4)</entry> 756 <entry> 757 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4508.html"> 758 N4508 759 </link> 760 </entry> 761 <entry align="center"> 6.1 </entry> 762 <entry><code> __cpp_lib_shared_mutex >= 201505 </code></entry> 763 </row> 764 765 <row> 766 <entry> Variadic <code>lock_guard</code> (Rev. 5) </entry> 767 <entry> 768 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0156r2.html"> 769 P0156R2 770 </link> 771 </entry> 772 <entry align="center"> 7.1 </entry> 773 <entry><code> __cpp_lib_scoped_lock >= 201703 </code></entry> 774 </row> 775 776 <row> 777 <entry> A byte type definition </entry> 778 <entry> 779 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0298r3.pdf"> 780 P0298R3 781 </link> 782 </entry> 783 <entry align="center"> 7.1 </entry> 784 <entry><code> __cpp_lib_byte >= 201603 </code> (since 7.3, see Note 2) 785 </entry> 786 </row> 787 788 <row> 789 <?dbhtml bgcolor="#B0B0B0" ?> 790 <entry> Elementary string conversions </entry> 791 <entry> 792 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0067r5.html"> 793 P0067R5 794 </link> 795 </entry> 796 <entry align="center"> 8.1 (only integral types supported) </entry> 797 <entry><code> __has_include(<charconv>) </code> 798 <code> __cpp_lib_to_chars >= 201611 </code></entry> 799 </row> 800 801 <row> 802 <entry> Homogeneous interface for variant, any and optional </entry> 803 <entry> 804 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0032r3.pdf"> 805 P0032R3 806 </link> 807 </entry> 808 <entry align="center"> 7.1 </entry> 809 <entry> 810 <code> __cpp_lib_any >= 201606 </code>, 811 <code> __cpp_lib_optional >= 201606 </code>, 812 <code> __cpp_lib_variant >= 201606 </code> 813 </entry> 814 </row> 815 816 <row> 817 <entry> Making Optional Greater Equal Again </entry> 818 <entry> 819 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0307r2.pdf"> 820 P0307R2 821 </link> 822 </entry> 823 <entry align="center"> 7.1 </entry> 824 <entry> <code> __cpp_lib_optional >= 201606 </code> </entry> 825 </row> 826 827 </tbody> 828</tgroup> 829</table> 830 831<para> 832Note 1: This feature is supported in GCC 7.1 and 7.2 but before GCC 7.3 the 833<code>__cpp_lib</code> macro is not defined, and compilation will fail if the 834header is included without using <option>-std</option> to enable C++17 support. 835</para> 836 837<para> 838Note 2: This feature is supported in older releases but the 839<code>__cpp_lib</code> macro is not defined to the right value 840(or not defined at all) until the version shown in parentheses. 841</para> 842 843<para> 844Note 3: The Parallel Algorithms have an external dependency on Intel TBB 2018 845or later. If the <filename class="headerfile"><execution></filename> 846header is included then <code>-ltbb</code> must be used to link to TBB. 847</para> 848 849<para> 850Note 4: The mathematical special functions are enabled in C++17 mode from 851GCC 7.1 onwards. For GCC 6.x or for C++11/C++14 define 852<code>__STDCPP_WANT_MATH_SPEC_FUNCS__</code> to a non-zero value 853and test for <code>__STDCPP_MATH_SPEC_FUNCS__ >= 201003L</code>. 854</para> 855 856<table frame="all" xml:id="table.cxx17_ts_status"> 857<title>C++ Technical Specifications Implementation Status</title> 858 859<tgroup cols="4" align="left" colsep="0" rowsep="1"> 860<colspec colname="c1"/> 861<colspec colname="c2"/> 862<colspec colname="c3"/> 863<colspec colname="c4"/> 864 <thead> 865 <row> 866 <entry>Paper</entry> 867 <entry>Title</entry> 868 <entry>Status</entry> 869 <entry>Comments</entry> 870 </row> 871 </thead> 872 873 <tbody> 874 875 <row> 876 <entry> 877 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2014/n4076.html"> 878 N4076 879 </link> 880 </entry> 881 <entry>A generalized callable negator</entry> 882 <entry>Y</entry> 883 <entry>Library Fundamentals 2 TS</entry> 884 </row> 885 886 <row> 887 <entry> 888 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2014/n4273.htm"> 889 N4273 890 </link> 891 </entry> 892 <entry>Uniform Container Erasure</entry> 893 <entry>Y</entry> 894 <entry>Library Fundamentals 2 TS</entry> 895 </row> 896 897 <row> 898 <entry> 899 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4061.pdf"> 900 N4061 901 </link> 902 </entry> 903 <entry>Greatest Common Divisor and Least Common Multiple</entry> 904 <entry>Y</entry> 905 <entry>Library Fundamentals 2 TS</entry> 906 </row> 907 908 <row> 909 <entry> 910 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4066.htm"> 911 N4066 912 </link> 913 </entry> 914 <entry>Delimited iterators</entry> 915 <entry>Y</entry> 916 <entry>Library Fundamentals 2 TS</entry> 917 </row> 918 919 <row> 920 <entry> 921 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4282.pdf"> 922 N4282 923 </link> 924 </entry> 925 <entry>The World's Dumbest Smart Pointer</entry> 926 <entry>Y</entry> 927 <entry>Library Fundamentals 2 TS</entry> 928 </row> 929 930 931 <row> 932 <entry> 933 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4388.html"> 934 N4388 935 </link> 936 </entry> 937 <entry>Const-Propagating Wrapper</entry> 938 <entry>Y</entry> 939 <entry>Library Fundamentals 2 TS</entry> 940 </row> 941 942 <row> 943 <entry> 944 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4391.html"> 945 N4391 946 </link> 947 </entry> 948 <entry> <code>make_array</code>, revision 4 </entry> 949 <entry>Y</entry> 950 <entry>Library Fundamentals 2 TS</entry> 951 </row> 952 953 <row> 954 <entry> 955 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4502.pdf"> 956 N4502 957 </link> 958 </entry> 959 <entry> Support for the C++ Detection Idiom, V2 </entry> 960 <entry>Y</entry> 961 <entry>Library Fundamentals 2 TS</entry> 962 </row> 963 964 <row> 965 <entry> 966 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4519.pdf"> 967 N4519 968 </link> 969 </entry> 970 <entry> Source-Code Information Capture </entry> 971 <entry>Y</entry> 972 <entry>Library Fundamentals 2 TS</entry> 973 </row> 974 975 <row> 976 <?dbhtml bgcolor="#C8B0B0" ?> 977 <entry> 978 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4521.html"> 979 N4521 980 </link> 981 </entry> 982 <entry> Merge Fundamentals V1 into V2 </entry> 983 <entry> 984 N (components from V1 are still in namespace 985 <code>fundamentals_v1</code>) 986 </entry> 987 <entry>Library Fundamentals 2 TS</entry> 988 </row> 989 990 <row> 991 <entry> 992 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/p0013r1.html"> 993 P0013R1 994 </link> 995 </entry> 996 <entry>Logical Operator Type Traits (revision 1)</entry> 997 <entry>Y</entry> 998 <entry>Library Fundamentals 2 TS</entry> 999 </row> 1000 1001 <row> 1002 <entry> 1003 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4531.html"> 1004 N4531 1005 </link> 1006 </entry> 1007 <entry>std::rand replacement, revision 3</entry> 1008 <entry>Y</entry> 1009 <entry>Library Fundamentals 2 TS</entry> 1010 </row> 1011 1012 </tbody> 1013</tgroup> 1014</table> 1015 1016<section xml:id="iso.2017.specific" xreflabel="Implementation Specific"><info><title>Implementation Specific Behavior</title></info> 1017 1018 <para>For behaviour which is also specified by previous standards, 1019 see <link linkend="iso.1998.specific">C++ 1998/2003 Implementation 1020 Specific Behavior</link> and <link linkend="iso.2011.specific">C++ 1021 2011 Implementation Specific Behavior</link>. This section only 1022 documents behaviour which is new in the 2017 standard. 1023 </para> 1024 1025 <para> 1026 <emphasis>20.5.1.2 [headers]</emphasis> 1027 Whether names from Annex K are declared by C++ headers depends on 1028 whether the underlying C library supports Annex K and declares the 1029 names. For the GNU C library, there is no Annex K support and so 1030 none of its names are declared by C++ headers. 1031 </para> 1032 1033 <para> 1034 <emphasis>23.6.5 [optional.bad_optional_access]</emphasis> 1035 <code>what()</code> returns <literal>"bad optional access"</literal>. 1036 </para> 1037 1038 <para> 1039 <emphasis>23.7.3 [variant.variant]</emphasis> 1040 <classname>variant</classname> supports over-aligned types. 1041 </para> 1042 1043 <para> 1044 <emphasis>23.7.10 [variant.bad.access]</emphasis> 1045 <code>what()</code> returns <literal>"Unexpected index"</literal>. 1046 </para> 1047 1048 <para> 1049 <emphasis>23.12.5.2 [memory.resource.pool.options]</emphasis> 1050 Let S equal <code>numeric_limits<size_t>::digits</code>. 1051 The limit for maximum number of blocks in a chunk is given by 1052 <inlineequation><mathphrase>2<superscript>N</superscript>-1</mathphrase></inlineequation>, 1053 where N is <inlineequation><mathphrase>min(19, 3 + S/2)</mathphrase></inlineequation>. 1054 The largest allocation size that will be allocated from a pool is 1055 <inlineequation><mathphrase>2<superscript>22</superscript></mathphrase></inlineequation> 1056 when <inlineequation><mathphrase>S > 20</mathphrase></inlineequation>, 1057 otherwise 3072 when <inlineequation><mathphrase>S > 16</mathphrase></inlineequation>, 1058 otherwise 768. 1059 </para> 1060 1061 <para> 1062 <emphasis>23.12.6.1 [memory.resource.monotonic.buffer.ctor]</emphasis> 1063 The default <code>next_buffer_size</code> is <code>128 * sizeof(void*)</code>. 1064 The default growth factor is <code>1.5</code>. 1065 </para> 1066 1067 <para> 1068 <emphasis>23.15.4.3 [meta.unary.prop]</emphasis> 1069 The predicate condition for 1070 <code>has_unique_object_representations</code> is true for all scalar 1071 types except floating point types. 1072 </para> 1073 1074 <para> 1075 <emphasis>23.19.3 [execpol.type], 1076 28.4.3 [algorithms.parallel.exec]</emphasis> 1077 There are no implementation-defined execution policies. 1078 </para> 1079 1080 <para> 1081 <emphasis>24.4.2 [string.view.template]</emphasis> 1082 <classname>basic_string_view<C, T>::iterator</classname> is 1083 <code>C*</code> and 1084 <classname>basic_string_view<C, T>::const_iterator</classname> is 1085 <code>const C*</code>. 1086 </para> 1087 1088 1089 <para> 1090 <emphasis>28.4.3 [algorithms.parallel.exec]</emphasis> 1091 Threads of execution created by <classname>std::thread</classname> 1092 provide concurrent forward progress guarantees, so threads of execution 1093 implicitly created by the library will provide parallel forward 1094 progress guarantees. 1095 </para> 1096 1097 <para> 1098 <emphasis>29.4.1 [cfenv.syn]</emphasis> 1099 The effects of the <filename><cfenv></filename> functions 1100 depends on whether the <code>FENV_ACCESS</code> pragma is supported, 1101 and on the C library that provides the header. 1102 </para> 1103 1104 <para> 1105 <emphasis>29.6.9 [c.math.rand]</emphasis> 1106 Whether the <function>rand</function> function may introduce data 1107 races depends on the target C library that provides the function. 1108 </para> 1109 1110 <para> 1111 <emphasis>29.9.5 [sf.cmath]</emphasis> 1112 The effect of calling the mathematical special functions with large 1113 inputs should be documented here. 1114 </para> 1115 1116 <para> 1117 <emphasis>30.10.2.1 [fs.conform.9945]</emphasis> 1118 The behavior of the filesystem library implementation will depend on 1119 the target operating system. Some features will not be supported 1120 on some targets. 1121 </para> 1122 1123 <para> 1124 <emphasis>30.10.5 [fs.filesystem.syn]</emphasis> 1125 The clock used for file times is an unspecified type 1126 with a signed 64-bit representation, capable of representing 1127 timestamps with nanosecond resolution. The clock's epoch is 1128 unspecified, but is not the same as the system clock's epoch. 1129 </para> 1130 1131 <para> 1132 <emphasis>30.10.7.1 [fs.path.generic]</emphasis> 1133 dot-dot in the root-directory refers to the root-directory itself. 1134 On Windows, a drive specifier such as <code>"C:"</code> or 1135 <code>"z:"</code> is treated as a root-name. On Cygwin, a path 1136 that begins with two successive directory separators is a 1137 root-name. Otherwise (for POSIX-like systems other than Cygwin), 1138 the implementation-defined root-name is an unspecified string 1139 which does not appear in any pathnames. 1140 </para> 1141 1142 <para> 1143 <emphasis>30.10.10.1 [fs.enum.path.format]</emphasis> 1144 The character sequence is always interpreted in the native pathname 1145 format. 1146 </para> 1147 1148 <para> 1149 <emphasis>30.10.15.4 [fs.op.file_size]</emphasis> 1150 If <code>!is_regular_file(p)</code>, an error is reported. 1151 </para> 1152 1153 1154</section> 1155 1156</section> 1157