Namespaces
Variants
Views
Actions

Difference between revisions of "Template:cpp/compiler support/20"

From cppreference.com
m
(Update to C++20)
Line 1: Line 1:
Note that this list may change, as the draft C++2a standard evolves.
+
=== C++20 core language features ===
  
=== C++2a core language features ===
+
{{compiler support|std=c++20|
 
+
{{compiler support|std=c++2a|
+
 
<!-- 201703 -->
 
<!-- 201703 -->
 
{{compiler_support_row  
 
{{compiler_support_row  
 
| feature=Allow lambda-capture {{tt|1=[=, this]}}
 
| feature=Allow lambda-capture {{tt|1=[=, this]}}
 
| reference={{wg21|P0409R2}}
 
| reference={{wg21|P0409R2}}
| version=c++2a-lang
+
| version=c++20-lang
 
| clang={{yes|6}}
 
| clang={{yes|6}}
 
| aclang={{yes|{{aclang ver|10.0}}}}
 
| aclang={{yes|{{aclang ver|10.0}}}}
Line 19: Line 17:
 
| feature={{tt|__VA_OPT__}}
 
| feature={{tt|__VA_OPT__}}
 
| reference={{wg21|P0306R4}}<br>{{wg21|P1042R1}}
 
| reference={{wg21|P0306R4}}<br>{{wg21|P1042R1}}
| version=c++2a-lang
+
| version=c++20-lang
 
| clang={{yes|9}}
 
| clang={{yes|9}}
 
| aclang={{yes|{{aclang ver|10.0}}}}
 
| aclang={{yes|{{aclang ver|10.0}}}}
Line 28: Line 26:
 
| feature=[[cpp/language/aggregate initialization#Designated initializers|Designated initializers]]
 
| feature=[[cpp/language/aggregate initialization#Designated initializers|Designated initializers]]
 
| reference={{wg21|P0329R4}}
 
| reference={{wg21|P0329R4}}
| version=c++2a-lang
+
| version=c++20-lang
 
| clang={{yes|1=<span title="Full C99 compatible superset of P0329, missing brace initializers">3.0 (partial)*</span><br>10}}
 
| clang={{yes|1=<span title="Full C99 compatible superset of P0329, missing brace initializers">3.0 (partial)*</span><br>10}}
 
| gcc={{yes||1=<span title="As non-standard extension that formed the basis for P0329, missing brace initializers">4.7 (partial)*</span><br>8}}
 
| gcc={{yes||1=<span title="As non-standard extension that formed the basis for P0329, missing brace initializers">4.7 (partial)*</span><br>8}}
Line 37: Line 35:
 
| feature=template-parameter-list for generic lambdas
 
| feature=template-parameter-list for generic lambdas
 
| reference={{wg21|P0428R2}}
 
| reference={{wg21|P0428R2}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|8}}
 
| gcc={{yes|8}}
 
| edg={{yes|5.1}}
 
| edg={{yes|5.1}}
Line 46: Line 44:
 
| feature=Default member initializers for bit-fields
 
| feature=Default member initializers for bit-fields
 
| reference={{wg21|P0683R1}}
 
| reference={{wg21|P0683R1}}
| version=c++2a-lang
+
| version=c++20-lang
 
| clang={{yes|6}}
 
| clang={{yes|6}}
 
| aclang={{yes|{{aclang ver|10.0}}}}
 
| aclang={{yes|{{aclang ver|10.0}}}}
Line 55: Line 53:
 
| feature=Initializer list constructors in class template argument deduction
 
| feature=Initializer list constructors in class template argument deduction
 
| reference={{wg21|P0702R1}}
 
| reference={{wg21|P0702R1}}
| version=c++2a-lang
+
| version=c++20-lang
 
| clang={{yes|6}}
 
| clang={{yes|6}}
 
| msvc={{yes|{{msvc ver|2017.7}}}}
 
| msvc={{yes|{{msvc ver|2017.7}}}}
Line 64: Line 62:
 
| feature=const&-qualified pointers to members
 
| feature=const&-qualified pointers to members
 
| reference={{wg21|P0704R1}}
 
| reference={{wg21|P0704R1}}
| version=c++2a-lang
+
| version=c++20-lang
 
| clang={{yes|6}}
 
| clang={{yes|6}}
 
| aclang={{yes|{{aclang ver|10.0}}}}
 
| aclang={{yes|{{aclang ver|10.0}}}}
Line 74: Line 72:
 
| feature=[[cpp/language/constraints|Concepts]]
 
| feature=[[cpp/language/constraints|Concepts]]
 
| reference={{wg21|P0734R0}}
 
| reference={{wg21|P0734R0}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|6<br/>(TS only)<br/>10}}
 
| gcc={{yes|6<br/>(TS only)<br/>10}}
 
| clang={{yes|10}}
 
| clang={{yes|10}}
Line 83: Line 81:
 
| feature=Lambdas in unevaluated contexts
 
| feature=Lambdas in unevaluated contexts
 
| reference={{wg21|P0315R4}}
 
| reference={{wg21|P0315R4}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
}}
 
}}
Line 89: Line 87:
 
| feature= [[cpp/language/operator_comparison#Three-way_comparison|Three-way comparison operator]]
 
| feature= [[cpp/language/operator_comparison#Three-way_comparison|Three-way comparison operator]]
 
| reference={{wg21|P0515R3}}
 
| reference={{wg21|P0515R3}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
| msvc={{yes|{{msvc ver|2019}}}}
 
| msvc={{yes|{{msvc ver|2019}}}}
Line 98: Line 96:
 
| feature=DR: Simplifying implicit lambda capture
 
| feature=DR: Simplifying implicit lambda capture
 
| reference={{wg21|P0588R1}}
 
| reference={{wg21|P0588R1}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|8}}
 
| gcc={{yes|8}}
 
| edg={{yes|5.1}}
 
| edg={{yes|5.1}}
Line 106: Line 104:
 
| feature=init-statements for range-based for
 
| feature=init-statements for range-based for
 
| reference={{wg21|P0614R1}}
 
| reference={{wg21|P0614R1}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| clang={{yes|8}}
 
| clang={{yes|8}}
Line 115: Line 113:
 
| feature=Default constructible and assignable stateless lambdas
 
| feature=Default constructible and assignable stateless lambdas
 
| reference={{wg21|P0624R2}}
 
| reference={{wg21|P0624R2}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| clang={{yes|8}}
 
| clang={{yes|8}}
Line 124: Line 122:
 
| feature=const mismatch with defaulted copy constructor
 
| feature=const mismatch with defaulted copy constructor
 
| reference={{wg21|P0641R2}}
 
| reference={{wg21|P0641R2}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| clang={{yes|8}}
 
| clang={{yes|8}}
Line 133: Line 131:
 
| feature=Access checking on specializations
 
| feature=Access checking on specializations
 
| reference={{wg21|P0692R1}}
 
| reference={{wg21|P0692R1}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes}}
 
| gcc={{yes}}
 
| edg={{yes|5.1}}
 
| edg={{yes|5.1}}
Line 141: Line 139:
 
| feature=ADL and function templates that are not visible
 
| feature=ADL and function templates that are not visible
 
| reference={{wg21|P0846R0}}
 
| reference={{wg21|P0846R0}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| msvc={{yes|{{msvc ver|2019.1}}}}
 
| msvc={{yes|{{msvc ver|2019.1}}}}
Line 150: Line 148:
 
| feature=Less eager instantiation of constexpr functions
 
| feature=Less eager instantiation of constexpr functions
 
| reference={{wg21|P0859R0}}
 
| reference={{wg21|P0859R0}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|1=<span title="mostly">5.2 (partial)*<br/>9</span>}}
 
| gcc={{yes|1=<span title="mostly">5.2 (partial)*<br/>9</span>}}
 
}}
 
}}
Line 157: Line 155:
 
| feature=Attributes {{attr|likely}} and {{attr|likely|unlikely}}
 
| feature=Attributes {{attr|likely}} and {{attr|likely|unlikely}}
 
| reference={{wg21|P0479R5}}
 
| reference={{wg21|P0479R5}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| edg={{yes|5.1}}
 
| edg={{yes|5.1}}
Line 164: Line 162:
 
| feature=Make {{tt|typename}} more optional
 
| feature=Make {{tt|typename}} more optional
 
| reference={{wg21|P0634R3}}
 
| reference={{wg21|P0634R3}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| edg={{yes|5.1}}
 
| edg={{yes|5.1}}
Line 171: Line 169:
 
| feature=Pack expansion in lambda init-capture
 
| feature=Pack expansion in lambda init-capture
 
| reference={{wg21|P0780R2}}
 
| reference={{wg21|P0780R2}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| msvc={{yes|{{msvc ver|2019.2}}}}
 
| msvc={{yes|{{msvc ver|2019.2}}}}
Line 179: Line 177:
 
| feature=Attribute {{attr|no_unique_address}}
 
| feature=Attribute {{attr|no_unique_address}}
 
| reference={{wg21|P0840R2}}
 
| reference={{wg21|P0840R2}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| edg={{yes|5.1}}
 
| edg={{yes|5.1}}
Line 187: Line 185:
 
| feature=DR: Relaxing the [[cpp/language/structured binding|structured bindings]] customization point finding rules
 
| feature=DR: Relaxing the [[cpp/language/structured binding|structured bindings]] customization point finding rules
 
| reference={{wg21|P0961R1}}
 
| reference={{wg21|P0961R1}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|8}}
 
| gcc={{yes|8}}
 
| clang={{yes|8}}
 
| clang={{yes|8}}
Line 197: Line 195:
 
| feature=DR: Relaxing the [[cpp/language/range-for|range-{{tt|for}} loop]] customization point finding rules
 
| feature=DR: Relaxing the [[cpp/language/range-for|range-{{tt|for}} loop]] customization point finding rules
 
| reference={{wg21|P0962R1}}
 
| reference={{wg21|P0962R1}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|8}}
 
| gcc={{yes|8}}
 
| edg={{yes|5.1}}
 
| edg={{yes|5.1}}
Line 204: Line 202:
 
| feature=DR: Allow structured bindings to accessible members
 
| feature=DR: Allow structured bindings to accessible members
 
| reference={{wg21|P0969R0}}
 
| reference={{wg21|P0969R0}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|8}}
 
| gcc={{yes|8}}
 
| clang={{yes|8}}
 
| clang={{yes|8}}
Line 215: Line 213:
 
| feature=[[cpp/memory/new/operator delete|Destroying operator delete]]
 
| feature=[[cpp/memory/new/operator delete|Destroying operator delete]]
 
| reference={{wg21|P0722R3}}
 
| reference={{wg21|P0722R3}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| clang={{yes|6}}
 
| clang={{yes|6}}
Line 224: Line 222:
 
| feature=Class types in non-type template parameters
 
| feature=Class types in non-type template parameters
 
| reference={{wg21|P0732R2}}
 
| reference={{wg21|P0732R2}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
}}
 
}}
Line 230: Line 228:
 
| feature=Deprecate implicit capture of {{tt|this}} via {{tt|1=[=]}}
 
| feature=Deprecate implicit capture of {{tt|this}} via {{tt|1=[=]}}
 
| reference={{wg21|P0806R2}}
 
| reference={{wg21|P0806R2}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| edg={{yes|5.1}}
 
| edg={{yes|5.1}}
Line 238: Line 236:
 
| feature={{ltt|cpp/language/explicit|explicit(bool)}}
 
| feature={{ltt|cpp/language/explicit|explicit(bool)}}
 
| reference={{wg21|P0892R2}}
 
| reference={{wg21|P0892R2}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| clang={{yes|9}}
 
| clang={{yes|9}}
Line 247: Line 245:
 
| feature=Integrating feature-test macros
 
| feature=Integrating feature-test macros
 
| reference={{wg21|P0941R2}}
 
| reference={{wg21|P0941R2}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|5}}
 
| gcc={{yes|5}}
 
| clang={{yes|3.4}}
 
| clang={{yes|3.4}}
Line 256: Line 254:
 
| feature=Prohibit aggregates with user-declared constructors
 
| feature=Prohibit aggregates with user-declared constructors
 
| reference={{wg21|P1008R1}}
 
| reference={{wg21|P1008R1}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| clang={{yes|8}}
 
| clang={{yes|8}}
Line 266: Line 264:
 
| feature=constexpr virtual function
 
| feature=constexpr virtual function
 
| reference={{wg21|P1064R0}}
 
| reference={{wg21|P1064R0}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| edg={{yes|5.1}}
 
| edg={{yes|5.1}}
Line 274: Line 272:
 
| feature=Consistency improvements for comparisons
 
| feature=Consistency improvements for comparisons
 
| reference={{wg21|P1120R0}}
 
| reference={{wg21|P1120R0}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
| clang={{maybe|8 (partial)<br>10}}
 
| clang={{maybe|8 (partial)<br>10}}
Line 284: Line 282:
 
| feature={{tt|char8_t}}
 
| feature={{tt|char8_t}}
 
| reference={{wg21|P0482R6}}
 
| reference={{wg21|P0482R6}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| clang={{yes|7}}
 
| clang={{yes|7}}
Line 293: Line 291:
 
| feature={{ltf|cpp/types/is_constant_evaluated|std::is_constant_evaluated}}
 
| feature={{ltf|cpp/types/is_constant_evaluated|std::is_constant_evaluated}}
 
| reference={{wg21|P0595R2}}
 
| reference={{wg21|P0595R2}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| edg={{yes|5.1}}
 
| edg={{yes|5.1}}
Line 302: Line 300:
 
| feature=constexpr {{tt|try}}-{{tt|catch}} blocks
 
| feature=constexpr {{tt|try}}-{{tt|catch}} blocks
 
| reference={{wg21|P1002R1}}
 
| reference={{wg21|P1002R1}}
| version=c++2a-lang
+
| version=c++20-lang
 
| clang={{yes|8}}
 
| clang={{yes|8}}
 
| aclang={{yes|{{aclang ver|10.0}}}}
 
| aclang={{yes|{{aclang ver|10.0}}}}
Line 311: Line 309:
 
| feature=[[cpp/language/consteval|Immediate functions]]
 
| feature=[[cpp/language/consteval|Immediate functions]]
 
| reference={{wg21|P1073R3}}
 
| reference={{wg21|P1073R3}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{maybe|1=<span title="no consteval virtual support">10 (partial)*</span>}}
 
| gcc={{maybe|1=<span title="no consteval virtual support">10 (partial)*</span>}}
 
| edg={{yes|5.1}}
 
| edg={{yes|5.1}}
Line 318: Line 316:
 
| feature=[[cpp/language/namespace|Nested inline namespaces]]
 
| feature=[[cpp/language/namespace|Nested inline namespaces]]
 
| reference={{wg21|P1094R2}}
 
| reference={{wg21|P1094R2}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| clang={{yes|8}}
 
| clang={{yes|8}}
Line 327: Line 325:
 
| reference={{wg21|P1141R2}}
 
| reference={{wg21|P1141R2}}
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
| version=c++2a-lang
+
| version=c++20-lang
 
}}
 
}}
 
{{compiler_support_row
 
{{compiler_support_row
 
| feature=Signed integers are two's complement
 
| feature=Signed integers are two's complement
 
| reference={{wg21|P1236R1}}
 
| reference={{wg21|P1236R1}}
| version=c++2a-lang
+
| version=c++20-lang
 
| clang={{yes|9}}
 
| clang={{yes|9}}
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
Line 339: Line 337:
 
| feature=constexpr {{tt|dynamic_cast}} and polymorphic {{tt|typeid}}
 
| feature=constexpr {{tt|dynamic_cast}} and polymorphic {{tt|typeid}}
 
| reference={{wg21|P1327R1}}
 
| reference={{wg21|P1327R1}}
| version=c++2a-lang
+
| version=c++20-lang
 
| edg={{yes|5.1}}
 
| edg={{yes|5.1}}
 
| clang={{yes|9}}
 
| clang={{yes|9}}
Line 347: Line 345:
 
| feature=Changing the active member of a union inside constexpr
 
| feature=Changing the active member of a union inside constexpr
 
| reference={{wg21|P1330R0}}
 
| reference={{wg21|P1330R0}}
| version=c++2a-lang
+
| version=c++20-lang
 
| msvc={{yes|{{msvc ver|2017}}}}
 
| msvc={{yes|{{msvc ver|2017}}}}
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
Line 357: Line 355:
 
| feature=[[cpp/language/coroutines|Coroutines]]
 
| feature=[[cpp/language/coroutines|Coroutines]]
 
| reference={{wg21|P0912R5}}
 
| reference={{wg21|P0912R5}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{maybe|10 (partial)}}
 
| gcc={{maybe|10 (partial)}}
 
| edg={{yes|5.1}}
 
| edg={{yes|5.1}}
Line 365: Line 363:
 
| feature=Parenthesized initialization of aggregates
 
| feature=Parenthesized initialization of aggregates
 
| reference={{wg21|P0960R3}}
 
| reference={{wg21|P0960R3}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
| edg={{yes|5.1}}
 
| edg={{yes|5.1}}
Line 372: Line 370:
 
| feature=DR: Array size deduction in [[cpp/language/new|new-expressions]]
 
| feature=DR: Array size deduction in [[cpp/language/new|new-expressions]]
 
| reference={{wg21|P1009R2}}
 
| reference={{wg21|P1009R2}}
| version=c++2a-lang
+
| version=c++20-lang
 
| edg={{yes|5.1}}
 
| edg={{yes|5.1}}
 
| clang={{yes|9}}
 
| clang={{yes|9}}
Line 379: Line 377:
 
| feature=[[cpp/language/modules|Modules]]
 
| feature=[[cpp/language/modules|Modules]]
 
| reference={{wg21|P1103R3}}
 
| reference={{wg21|P1103R3}}
| version=c++2a-lang
+
| version=c++20-lang
 
| clang={{maybe|8 (partial)}}
 
| clang={{maybe|8 (partial)}}
 
}}
 
}}
Line 385: Line 383:
 
| feature=Stronger Unicode requirements
 
| feature=Stronger Unicode requirements
 
| reference={{wg21|P1041R4}}<br>{{wg21|P1139R2}}
 
| reference={{wg21|P1041R4}}<br>{{wg21|P1139R2}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
| clang={{yes}}
 
| clang={{yes}}
Line 393: Line 391:
 
| feature={{tt|1=<=> != ==}}
 
| feature={{tt|1=<=> != ==}}
 
| reference={{wg21|P1185R2}}
 
| reference={{wg21|P1185R2}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
| msvc={{yes|{{msvc ver|2019.2}}}}
 
| msvc={{yes|{{msvc ver|2019.2}}}}
Line 402: Line 400:
 
| feature=DR: Explicitly defaulted functions with different exception specifications
 
| feature=DR: Explicitly defaulted functions with different exception specifications
 
| reference={{wg21|P1286R2}}
 
| reference={{wg21|P1286R2}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
| clang={{yes|9}}
 
| clang={{yes|9}}
Line 410: Line 408:
 
| feature=Lambda capture and storage class specifiers of structured bindings
 
| feature=Lambda capture and storage class specifiers of structured bindings
 
| reference={{wg21|P1091R3}}<br>{{wg21|P1381R1}}
 
| reference={{wg21|P1091R3}}<br>{{wg21|P1381R1}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
| edg={{yes|5.1}}
 
| edg={{yes|5.1}}
Line 419: Line 417:
 
| feature=Permit conversions to arrays of unknown bound
 
| feature=Permit conversions to arrays of unknown bound
 
| reference={{wg21|P0388R4}}
 
| reference={{wg21|P0388R4}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
| edg={{yes|6.0}}
 
| edg={{yes|6.0}}
Line 426: Line 424:
 
| feature=constexpr container operations
 
| feature=constexpr container operations
 
| reference={{wg21|P0784R7}}
 
| reference={{wg21|P0784R7}}
| version=c++2a-lang
+
| version=c++20-lang
 
| edg={{yes|6.0}}
 
| edg={{yes|6.0}}
 
| clang={{yes|10}}
 
| clang={{yes|10}}
Line 434: Line 432:
 
| feature=Deprecating some uses of {{tt|volatile}}
 
| feature=Deprecating some uses of {{tt|volatile}}
 
| reference={{wg21|P1152R4}}
 
| reference={{wg21|P1152R4}}
| version=c++2a-lang
+
| version=c++20-lang
 
| edg={{yes|6.0}}
 
| edg={{yes|6.0}}
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
Line 442: Line 440:
 
| feature={{ltt|cpp/language/constinit}}
 
| feature={{ltt|cpp/language/constinit}}
 
| reference={{wg21|P1143R2}}
 
| reference={{wg21|P1143R2}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
| clang={{yes|10}}
 
| clang={{yes|10}}
Line 449: Line 447:
 
| feature=Deprecate comma operator in subscripts
 
| feature=Deprecate comma operator in subscripts
 
| reference={{wg21|P1161R3}}
 
| reference={{wg21|P1161R3}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
| clang={{yes|9}}
 
| clang={{yes|9}}
Line 457: Line 455:
 
| feature={{attr|nodiscard}} with message
 
| feature={{attr|nodiscard}} with message
 
| reference={{wg21|P1301R4}}
 
| reference={{wg21|P1301R4}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
| clang={{yes|9}}
 
| clang={{yes|9}}
Line 465: Line 463:
 
| feature=Trivial default initialization in constexpr functions
 
| feature=Trivial default initialization in constexpr functions
 
| reference={{wg21|P1331R2}}
 
| reference={{wg21|P1331R2}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
| clang={{yes|10}}
 
| clang={{yes|10}}
Line 473: Line 471:
 
| feature=Unevaluated asm-declaration in constexpr functions
 
| feature=Unevaluated asm-declaration in constexpr functions
 
| reference={{wg21|P1668R1}}
 
| reference={{wg21|P1668R1}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
| clang={{yes|10}}
 
| clang={{yes|10}}
Line 481: Line 479:
 
| feature=using enum
 
| feature=using enum
 
| reference={{wg21|P1099R5}}
 
| reference={{wg21|P1099R5}}
| version=c++2a-lang
+
| version=c++20-lang
 
| msvc={{yes|{{msvc ver|2019.4}}}}
 
| msvc={{yes|{{msvc ver|2019.4}}}}
 
}}
 
}}
Line 487: Line 485:
 
| feature=Synthesizing three-way comparison for specified comparison category
 
| feature=Synthesizing three-way comparison for specified comparison category
 
| reference={{wg21|P1186R3}}
 
| reference={{wg21|P1186R3}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
| edg={{yes|6.0}}
 
| edg={{yes|6.0}}
Line 496: Line 494:
 
| feature=DR: {{attr/core|nodiscard}} for constructors
 
| feature=DR: {{attr/core|nodiscard}} for constructors
 
| reference={{wg21|P1771R1}}
 
| reference={{wg21|P1771R1}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
| edg={{yes|6.0}}
 
| edg={{yes|6.0}}
Line 505: Line 503:
 
| feature=[[cpp/language/class template argument deduction|Class template argument deduction]] for alias templates
 
| feature=[[cpp/language/class template argument deduction|Class template argument deduction]] for alias templates
 
| reference={{wg21|P1814R0}}
 
| reference={{wg21|P1814R0}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
}}
 
}}
Line 511: Line 509:
 
| feature=Class template argument deduction for aggregates
 
| feature=Class template argument deduction for aggregates
 
| reference={{wg21|P1816R0}}
 
| reference={{wg21|P1816R0}}
| version=c++2a-lang
+
| version=c++20-lang
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
}}
 
}}
Line 517: Line 515:
 
| feature=DR: [[cpp/language/return|Implicit move]] for more local objects and rvalue references
 
| feature=DR: [[cpp/language/return|Implicit move]] for more local objects and rvalue references
 
| reference={{wg21|P1825R0}}
 
| reference={{wg21|P1825R0}}
| version=c++2a-lang
+
| version=c++20-lang
 
| edg={{yes|6.0}}
 
| edg={{yes|6.0}}
 
| msvc={{yes|{{msvc ver|2019.4}}}}
 
| msvc={{yes|{{msvc ver|2019.4}}}}
Line 523: Line 521:
 
}}
 
}}
  
=== C++2a library features ===
+
=== C++20 library features ===
{{standard library support|std=c++2a|
+
{{standard library support|std=c++20|
 
<!-- 201707 -->
 
<!-- 201707 -->
 
{{standard library support row  
 
{{standard library support row  
 
| feature={{ltt|cpp/types/endian|std::endian}}
 
| feature={{ltt|cpp/types/endian|std::endian}}
 
| reference={{wg21|P0463R1}}
 
| reference={{wg21|P0463R1}}
| version=c++2a
+
| version=c++20
 
| clang={{yes|7}}
 
| clang={{yes|7}}
 
| gcc={{yes|8}}
 
| gcc={{yes|8}}
Line 538: Line 536:
 
| feature=Extending {{lc|std::make_shared()}} to support arrays
 
| feature=Extending {{lc|std::make_shared()}} to support arrays
 
| reference={{wg21|P0674R1}}
 
| reference={{wg21|P0674R1}}
| version=c++2a
+
| version=c++20
 
}}
 
}}
 
<!-- 201711 -->
 
<!-- 201711 -->
Line 544: Line 542:
 
| feature=Floating point atomic
 
| feature=Floating point atomic
 
| reference={{wg21|P0020R6}}
 
| reference={{wg21|P0020R6}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
| msvc={{yes|{{msvc ver|2019.2}}}}
 
| msvc={{yes|{{msvc ver|2019.2}}}}
Line 552: Line 550:
 
| feature=[[cpp/io/basic_syncbuf|Synchronized buffered]] [[cpp/io/basic_osyncstream|ostream]]
 
| feature=[[cpp/io/basic_syncbuf|Synchronized buffered]] [[cpp/io/basic_osyncstream|ostream]]
 
| reference={{wg21|P0053R7}}
 
| reference={{wg21|P0053R7}}
| version=c++2a
+
| version=c++20
 
}}
 
}}
  
Line 558: Line 556:
 
| feature={{tt|constexpr}} for {{header|algorithm}} and {{header|utility}}
 
| feature={{tt|constexpr}} for {{header|algorithm}} and {{header|utility}}
 
| reference={{wg21|P0202R3}}
 
| reference={{wg21|P0202R3}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
| clang={{maybe|8 (partial)}}
 
| clang={{maybe|8 (partial)}}
Line 566: Line 564:
 
| feature=More {{tt|constexpr}} for {{header|complex}}
 
| feature=More {{tt|constexpr}} for {{header|complex}}
 
| reference={{wg21|P0415R1}}
 
| reference={{wg21|P0415R1}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| clang={{maybe|7 (partial)}}
 
| clang={{maybe|7 (partial)}}
Line 574: Line 572:
 
| feature=Make {{lc|std::memory_order}} a scoped enumeration
 
| feature=Make {{lc|std::memory_order}} a scoped enumeration
 
| reference={{wg21|P0439R0}}
 
| reference={{wg21|P0439R0}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| clang={{yes|9}}
 
| clang={{yes|9}}
Line 582: Line 580:
 
| feature=[[cpp/string/basic_string|String]] prefix and suffix checking
 
| feature=[[cpp/string/basic_string|String]] prefix and suffix checking
 
| reference={{wg21|P0457R2}}
 
| reference={{wg21|P0457R2}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| clang={{yes|6}}
 
| clang={{yes|6}}
Line 591: Line 589:
 
| feature=Library support for {{tt|1=operator<=>}} {{header|compare}}
 
| feature=Library support for {{tt|1=operator<=>}} {{header|compare}}
 
| reference={{wg21|P0768R1}}
 
| reference={{wg21|P0768R1}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
| clang={{maybe|7 (partial)}}
 
| clang={{maybe|7 (partial)}}
Line 600: Line 598:
 
| feature={{ltt|cpp/types/remove_cvref|std::remove_cvref}}
 
| feature={{ltt|cpp/types/remove_cvref|std::remove_cvref}}
 
| reference={{wg21|P0550R2}}
 
| reference={{wg21|P0550R2}}
| version=c++2a
+
| version=c++20
 
| clang={{yes|6}}
 
| clang={{yes|6}}
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
Line 609: Line 607:
 
| feature={{attr/core|nodiscard}} in the standard library
 
| feature={{attr/core|nodiscard}} in the standard library
 
| reference={{wg21|P0600R1}}
 
| reference={{wg21|P0600R1}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| clang={{maybe|7 (partial)}}
 
| clang={{maybe|7 (partial)}}
Line 618: Line 616:
 
| feature=Using {{tt|std::move}} in [[cpp/numeric|numeric algorithms]]
 
| feature=Using {{tt|std::move}} in [[cpp/numeric|numeric algorithms]]
 
| reference={{wg21|P0616R0}}
 
| reference={{wg21|P0616R0}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| msvc={{yes|{{msvc ver|2019.3}}}}
 
| msvc={{yes|{{msvc ver|2019.3}}}}
Line 626: Line 624:
 
| feature=Utility to convert a pointer to a raw pointer
 
| feature=Utility to convert a pointer to a raw pointer
 
| reference={{wg21|P0653R2}}
 
| reference={{wg21|P0653R2}}
| version=c++2a
+
| version=c++20
 
| clang={{yes|6}}
 
| clang={{yes|6}}
 
| gcc={{yes|8}}
 
| gcc={{yes|8}}
Line 635: Line 633:
 
| feature=Atomic {{ltt|cpp/memory/shared_ptr/atomic2|std::shared_ptr}} and {{ltt|cpp/memory/weak_ptr/atomic2|std::weak_ptr}}
 
| feature=Atomic {{ltt|cpp/memory/shared_ptr/atomic2|std::shared_ptr}} and {{ltt|cpp/memory/weak_ptr/atomic2|std::weak_ptr}}
 
| reference={{wg21|P0718R2}}
 
| reference={{wg21|P0718R2}}
| version=c++2a
+
| version=c++20
 
}}
 
}}
 
<!-- 201803 -->
 
<!-- 201803 -->
Line 641: Line 639:
 
| feature={{ltt|cpp/container/span|std::span}}
 
| feature={{ltt|cpp/container/span|std::span}}
 
| reference={{wg21|P0122R7}}
 
| reference={{wg21|P0122R7}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
| clang={{yes|7}}
 
| clang={{yes|7}}
Line 649: Line 647:
 
| feature=[[cpp/chrono#Calendar|Calendar]] and [[cpp/chrono#Time zone|timezone]]
 
| feature=[[cpp/chrono#Calendar|Calendar]] and [[cpp/chrono#Time zone|timezone]]
 
| reference={{wg21|P0355R7}}
 
| reference={{wg21|P0355R7}}
| version=c++2a
+
| version=c++20
 
| clang={{maybe|7 (partial)}}
 
| clang={{maybe|7 (partial)}}
 
}}
 
}}
Line 656: Line 654:
 
| feature={{header|version}}
 
| feature={{header|version}}
 
| reference={{wg21|P0754R2}}
 
| reference={{wg21|P0754R2}}
| version=c++2a
+
| version=c++20
 
| clang={{yes|7}}
 
| clang={{yes|7}}
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
Line 665: Line 663:
 
| feature=Comparing unordered containers
 
| feature=Comparing unordered containers
 
| reference={{wg21|P0809R0}}
 
| reference={{wg21|P0809R0}}
| version=c++2a
+
| version=c++20
 
| msvc={{yes|{{msvc ver|2010}}}}
 
| msvc={{yes|{{msvc ver|2010}}}}
 
}}
 
}}
Line 672: Line 670:
 
| feature={{named req|ConstexprIterator}} requirements
 
| feature={{named req|ConstexprIterator}} requirements
 
| reference={{wg21|P0858R0}}
 
| reference={{wg21|P0858R0}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| msvc={{yes|{{msvc ver|2017.3}}}}
 
| msvc={{yes|{{msvc ver|2017.3}}}}
Line 680: Line 678:
 
| feature={{lc|std::basic_string::reserve()}} should not shrink
 
| feature={{lc|std::basic_string::reserve()}} should not shrink
 
| reference={{wg21|P0966R1}}
 
| reference={{wg21|P0966R1}}
| version=c++2a
+
| version=c++20
 
| clang={{yes|8}}
 
| clang={{yes|8}}
 
}}
 
}}
Line 688: Line 686:
 
| reference={{wg21|P0019R8}}
 
| reference={{wg21|P0019R8}}
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
| version=c++2a
+
| version=c++20
 
}}
 
}}
  
Line 694: Line 692:
 
| feature={{tt|contains()}} member function of associative containers
 
| feature={{tt|contains()}} member function of associative containers
 
| reference={{wg21|P0458R2}}
 
| reference={{wg21|P0458R2}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| msvc={{yes|{{msvc ver|2019.1}}}}
 
| msvc={{yes|{{msvc ver|2019.1}}}}
Line 702: Line 700:
 
| feature=DR: Guaranteed copy elision for [[cpp/memory/scoped_allocator_adaptor/construct|piecewise construction]]
 
| feature=DR: Guaranteed copy elision for [[cpp/memory/scoped_allocator_adaptor/construct|piecewise construction]]
 
| reference={{wg21|P0475R1}}
 
| reference={{wg21|P0475R1}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
}}
 
}}
Line 709: Line 707:
 
| feature={{ltf|cpp/numeric/bit_cast|std::bit_cast}}
 
| feature={{ltf|cpp/numeric/bit_cast|std::bit_cast}}
 
| reference={{wg21|P0476R2}}
 
| reference={{wg21|P0476R2}}
| version=c++2a
+
| version=c++20
 
}}
 
}}
  
Line 715: Line 713:
 
| feature=[[cpp/header/bit|Integral power-of-2 operations]]
 
| feature=[[cpp/header/bit|Integral power-of-2 operations]]
 
| reference={{wg21|P0556R3}}
 
| reference={{wg21|P0556R3}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
}}
 
}}
Line 722: Line 720:
 
| feature=Improving the return value of erase-like algorithms
 
| feature=Improving the return value of erase-like algorithms
 
| reference={{wg21|P0646R1}}
 
| reference={{wg21|P0646R1}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| msvc={{yes|{{msvc ver|2019.1}}}}
 
| msvc={{yes|{{msvc ver|2019.1}}}}
Line 730: Line 728:
 
| feature={{ltt|cpp/memory/new/destroying_delete_t|std::destroying_delete}}
 
| feature={{ltt|cpp/memory/new/destroying_delete_t|std::destroying_delete}}
 
| reference={{wg21|P0722R3}}
 
| reference={{wg21|P0722R3}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| clang={{yes|9}}
 
| clang={{yes|9}}
Line 738: Line 736:
 
| feature={{ltt|cpp/types/is_convertible|std::is_nothrow_convertible}}
 
| feature={{ltt|cpp/types/is_convertible|std::is_nothrow_convertible}}
 
| reference={{wg21|P0758R1}}
 
| reference={{wg21|P0758R1}}
| version=c++2a
+
| version=c++20
 
| clang={{yes|9}}
 
| clang={{yes|9}}
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
Line 747: Line 745:
 
| feature=Add [[cpp/algorithm/shift|shift]] to {{tt|<algorithm>}}
 
| feature=Add [[cpp/algorithm/shift|shift]] to {{tt|<algorithm>}}
 
| reference={{wg21|P0769R2}}
 
| reference={{wg21|P0769R2}}
| version=c++2a
+
| version=c++20
 
| msvc={{yes|{{msvc ver|2019.1}}}}
 
| msvc={{yes|{{msvc ver|2019.1}}}}
 
}}
 
}}
Line 754: Line 752:
 
| feature=Constexpr for {{lc|std::swap()}} and {{tt|swap}} related functions
 
| feature=Constexpr for {{lc|std::swap()}} and {{tt|swap}} related functions
 
| reference={{wg21|P0879R0}}
 
| reference={{wg21|P0879R0}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
}}
 
}}
Line 761: Line 759:
 
| feature={{ltt|cpp/types/type_identity|std::type_identity}}
 
| feature={{ltt|cpp/types/type_identity|std::type_identity}}
 
| reference={{wg21|P0887R1}}
 
| reference={{wg21|P0887R1}}
| version=c++2a
+
| version=c++20
 
| clang={{yes|8}}
 
| clang={{yes|8}}
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
Line 770: Line 768:
 
| feature=[[cpp/concepts|Concepts library]]
 
| feature=[[cpp/concepts|Concepts library]]
 
| reference={{wg21|P0898R3}}
 
| reference={{wg21|P0898R3}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
| msvc={{yes|{{msvc ver|2019.3}}}}
 
| msvc={{yes|{{msvc ver|2019.3}}}}
Line 778: Line 776:
 
| feature={{tt|constexpr}} [[cpp/container/array/operator cmp|comparison operators]] for {{tt|std::array}}
 
| feature={{tt|constexpr}} [[cpp/container/array/operator cmp|comparison operators]] for {{tt|std::array}}
 
| reference={{wg21|P1023R0}}
 
| reference={{wg21|P1023R0}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
| clang={{yes|8}}
 
| clang={{yes|8}}
Line 786: Line 784:
 
| feature=[[cpp/utility/functional/unwrap_reference|{{tt|std::unwrap_ref_decay}} and {{tt|std::unwrap_reference}}]]
 
| feature=[[cpp/utility/functional/unwrap_reference|{{tt|std::unwrap_ref_decay}} and {{tt|std::unwrap_reference}}]]
 
| reference={{wg21|P0318R1}}
 
| reference={{wg21|P0318R1}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| clang={{yes|8}}
 
| clang={{yes|8}}
Line 795: Line 793:
 
| feature={{ltf|cpp/utility/functional/bind_front|std::bind_front}}
 
| feature={{ltf|cpp/utility/functional/bind_front|std::bind_front}}
 
| reference={{wg21|P0356R5}}
 
| reference={{wg21|P0356R5}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
}}
 
}}
Line 802: Line 800:
 
| feature={{lc|std::reference_wrapper}} for incomplete types
 
| feature={{lc|std::reference_wrapper}} for incomplete types
 
| reference={{wg21|P0357R3}}
 
| reference={{wg21|P0357R3}}
| version=c++2a
+
| version=c++20
 
| clang={{yes|8}}
 
| clang={{yes|8}}
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
Line 810: Line 808:
 
| feature=Fixing {{ltt|cpp/io/basic_istream/operator_gtgt2|operator>>(basic_istream&, CharT*)}}
 
| feature=Fixing {{ltt|cpp/io/basic_istream/operator_gtgt2|operator>>(basic_istream&, CharT*)}}
 
| reference={{wg21|P0487R1}}
 
| reference={{wg21|P0487R1}}
| version=c++2a
+
| version=c++20
 
| clang={{yes|8}}
 
| clang={{yes|8}}
 
| msvc={{yes|{{msvc ver|2019.3}}}}
 
| msvc={{yes|{{msvc ver|2019.3}}}}
Line 818: Line 816:
 
| feature=Library support for {{tt|char8_t}}
 
| feature=Library support for {{tt|char8_t}}
 
| reference={{wg21|P0482R6}}
 
| reference={{wg21|P0482R6}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| msvc={{yes|{{msvc ver|2019.2}}}}
 
| msvc={{yes|{{msvc ver|2019.2}}}}
Line 826: Line 824:
 
| feature=[[cpp/memory/uses_allocator_construction_args|Utility functions]] to implement [[cpp/memory/make_obj_using_allocator|uses-allocator]] [[cpp/memory/uninitialized_construct_using_allocator|construction]]
 
| feature=[[cpp/memory/uses_allocator_construction_args|Utility functions]] to implement [[cpp/memory/make_obj_using_allocator|uses-allocator]] [[cpp/memory/uninitialized_construct_using_allocator|construction]]
 
| reference={{wg21|P0591R4}}
 
| reference={{wg21|P0591R4}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
}}
 
}}
Line 836: Line 834:
 
| clang={{yes|8}}
 
| clang={{yes|8}}
 
| gcc={{yes|8.3}}
 
| gcc={{yes|8.3}}
| version=c++2a
+
| version=c++20
 
}}
 
}}
  
Line 842: Line 840:
 
| feature=A sane {{lc|std::variant}} converting constructor
 
| feature=A sane {{lc|std::variant}} converting constructor
 
| reference={{wg21|P0608R3}}
 
| reference={{wg21|P0608R3}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
| clang={{yes|9}}
 
| clang={{yes|9}}
Line 850: Line 848:
 
| feature={{lc|std::function}}'s move constructor should be {{tt|noexcept}}
 
| feature={{lc|std::function}}'s move constructor should be {{tt|noexcept}}
 
| reference={{wg21|P0771R1}}
 
| reference={{wg21|P0771R1}}
| version=c++2a
+
| version=c++20
 
| clang={{yes|6}}
 
| clang={{yes|6}}
 
| msvc={{yes|{{msvc ver|2019.2}}}}
 
| msvc={{yes|{{msvc ver|2019.2}}}}
Line 859: Line 857:
 
| feature=The [[cpp/iterator|One]] [[cpp/ranges|Ranges]] [[cpp/algorithm/ranges|Proposal]]
 
| feature=The [[cpp/iterator|One]] [[cpp/ranges|Ranges]] [[cpp/algorithm/ranges|Proposal]]
 
| reference={{wg21|P0896R4}}
 
| reference={{wg21|P0896R4}}
| version=c++2a
+
| version=c++20
 
}}
 
}}
  
Line 865: Line 863:
 
| feature=Heterogeneous lookup for unordered containers
 
| feature=Heterogeneous lookup for unordered containers
 
| reference={{wg21|P0919R3}}
 
| reference={{wg21|P0919R3}}
| version=c++2a
+
| version=c++20
 
| msvc={{yes|{{msvc ver|2019.3}}}}
 
| msvc={{yes|{{msvc ver|2019.3}}}}
 
}}
 
}}
Line 872: Line 870:
 
| feature={{header|chrono}} {{tt|zero()}}, {{tt|min()}}, and {{tt|max()}} should be {{tt|noexcept}}
 
| feature={{header|chrono}} {{tt|zero()}}, {{tt|min()}}, and {{tt|max()}} should be {{tt|noexcept}}
 
| reference={{wg21|P0972R0}}
 
| reference={{wg21|P0972R0}}
| version=c++2a
+
| version=c++20
 
| clang={{yes|8}}
 
| clang={{yes|8}}
 
| msvc={{yes|{{msvc ver|2017.7}}}}
 
| msvc={{yes|{{msvc ver|2017.7}}}}
Line 881: Line 879:
 
| feature={{tt|constexpr}} in {{lc|std::pointer_traits}}
 
| feature={{tt|constexpr}} in {{lc|std::pointer_traits}}
 
| reference={{wg21|P1006R1}}
 
| reference={{wg21|P1006R1}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| clang={{yes|8}}
 
| clang={{yes|8}}
Line 889: Line 887:
 
| feature={{ltf|cpp/memory/assume_aligned|std::assume_aligned}}
 
| feature={{ltf|cpp/memory/assume_aligned|std::assume_aligned}}
 
| reference={{wg21|P1007R3}}
 
| reference={{wg21|P1007R3}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
}}
 
}}
Line 896: Line 894:
 
| feature=Remove comparison operators of {{tt|std::span}}
 
| feature=Remove comparison operators of {{tt|std::span}}
 
| reference={{wg21|P1085R2}}
 
| reference={{wg21|P1085R2}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
| clang={{yes|8}}
 
| clang={{yes|8}}
Line 904: Line 902:
 
| feature=Make stateful allocator propagation more consistent for {{ltt|cpp/string/basic_string/operator+|operator+(basic_string)}}
 
| feature=Make stateful allocator propagation more consistent for {{ltt|cpp/string/basic_string/operator+|operator+(basic_string)}}
 
| reference={{wg21|P1165R1}}
 
| reference={{wg21|P1165R1}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
}}
 
}}
Line 911: Line 909:
 
| feature=[[cpp/container/vector/erase2|Consistent container erasure]]
 
| feature=[[cpp/container/vector/erase2|Consistent container erasure]]
 
| reference={{wg21|P1209R0}}
 
| reference={{wg21|P1209R0}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| clang={{yes|8}}
 
| clang={{yes|8}}
Line 919: Line 917:
 
| feature={{ltf|cpp/numeric/lerp|std::lerp}} and {{ltf|cpp/numeric/midpoint|std::midpoint}}
 
| feature={{ltf|cpp/numeric/lerp|std::lerp}} and {{ltf|cpp/numeric/midpoint|std::midpoint}}
 
| reference={{wg21|P0811R3}}
 
| reference={{wg21|P0811R3}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| clang={{yes|9}}
 
| clang={{yes|9}}
Line 927: Line 925:
 
| feature=Usability enhancements for {{tt|std::span}}
 
| feature=Usability enhancements for {{tt|std::span}}
 
| reference={{wg21|P1024R3}}
 
| reference={{wg21|P1024R3}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
| clang={{yes|9}}
 
| clang={{yes|9}}
Line 935: Line 933:
 
| feature=DR: Make {{ltf|cpp/filesystem/create_directory}} Intuitive
 
| feature=DR: Make {{ltf|cpp/filesystem/create_directory}} Intuitive
 
| reference={{wg21|P1164R1}}
 
| reference={{wg21|P1164R1}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|8.3}}
 
| gcc={{yes|8.3}}
 
| msvc={{yes|{{msvc ver|2019}}}}
 
| msvc={{yes|{{msvc ver|2019}}}}
Line 943: Line 941:
 
| feature={{ltf|cpp/iterator/size|std::ssize}} and unsigned extent for {{tt|std::span}}
 
| feature={{ltf|cpp/iterator/size|std::ssize}} and unsigned extent for {{tt|std::span}}
 
| reference={{wg21|P1227R2}}
 
| reference={{wg21|P1227R2}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
| clang={{yes|9}}
 
| clang={{yes|9}}
Line 951: Line 949:
 
| feature=Traits for ([[cpp/types/is_unbounded_array|un]])[[cpp/types/is_bounded_array|bounded]] arrays
 
| feature=Traits for ([[cpp/types/is_unbounded_array|un]])[[cpp/types/is_bounded_array|bounded]] arrays
 
| reference={{wg21|P1357R0}}
 
| reference={{wg21|P1357R0}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| clang={{yes|9}}
 
| clang={{yes|9}}
Line 959: Line 957:
 
| feature={{ltf|cpp/container/array/to_array|std::to_array}}
 
| feature={{ltf|cpp/container/array/to_array|std::to_array}}
 
| reference={{wg21|P0325R4}}
 
| reference={{wg21|P0325R4}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
}}
 
}}
Line 966: Line 964:
 
| feature=Efficient access to {{lc|std::basic_stringbuf}}’s Buffer
 
| feature=Efficient access to {{lc|std::basic_stringbuf}}’s Buffer
 
| reference={{wg21|P0408R7}}
 
| reference={{wg21|P0408R7}}
| version=c++2a
+
| version=c++20
 
}}
 
}}
  
Line 972: Line 970:
 
| feature=[[cpp/types/is_layout_compatible|Layout]]-[[cpp/types/is_corresponding_member|compatibility]] and [[cpp/types/is_pointer_interconvertible_base_of|pointer]]-[[cpp/types/is_pointer_interconvertible_with_class|interconvertibility]] traits
 
| feature=[[cpp/types/is_layout_compatible|Layout]]-[[cpp/types/is_corresponding_member|compatibility]] and [[cpp/types/is_pointer_interconvertible_base_of|pointer]]-[[cpp/types/is_pointer_interconvertible_with_class|interconvertibility]] traits
 
| reference={{wg21|P0466R5}}
 
| reference={{wg21|P0466R5}}
| version=c++2a
+
| version=c++20
 
}}
 
}}
  
Line 978: Line 976:
 
| feature=[[cpp/numeric|Bit operations]]
 
| feature=[[cpp/numeric|Bit operations]]
 
| reference={{wg21|P0553R4}}
 
| reference={{wg21|P0553R4}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|9}}
 
| gcc={{yes|9}}
 
| clang={{yes|9}}
 
| clang={{yes|9}}
Line 986: Line 984:
 
| feature=[[cpp/numeric/constants|Mathematical constants]]
 
| feature=[[cpp/numeric/constants|Mathematical constants]]
 
| reference={{wg21|P0631R8}}
 
| reference={{wg21|P0631R8}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
}}
 
}}
Line 993: Line 991:
 
| feature=[[cpp/utility/format|Text formatting]]
 
| feature=[[cpp/utility/format|Text formatting]]
 
| reference={{wg21|P0645R10}}
 
| reference={{wg21|P0645R10}}
| version=c++2a
+
| version=c++20
 
}}
 
}}
  
Line 999: Line 997:
 
| feature={{ltt|cpp/thread/stop_token|std::stop_token}} and {{ltt|cpp/thread/jthread|std::jthread}}
 
| feature={{ltt|cpp/thread/stop_token|std::stop_token}} and {{ltt|cpp/thread/jthread|std::jthread}}
 
| reference={{wg21|P0660R10}}
 
| reference={{wg21|P0660R10}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
}}
 
}}
Line 1,006: Line 1,004:
 
| feature=constexpr {{lc|std::allocator}} and related utilities
 
| feature=constexpr {{lc|std::allocator}} and related utilities
 
| reference={{wg21|P0784R7}}
 
| reference={{wg21|P0784R7}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
}}
 
}}
Line 1,013: Line 1,011:
 
| feature=constexpr {{lc|std::string}}
 
| feature=constexpr {{lc|std::string}}
 
| reference={{wg21|P0980R1}}
 
| reference={{wg21|P0980R1}}
| version=c++2a
+
| version=c++20
 
}}
 
}}
  
Line 1,019: Line 1,017:
 
| feature=constexpr {{lc|std::vector}}
 
| feature=constexpr {{lc|std::vector}}
 
| reference={{wg21|P1004R2}}
 
| reference={{wg21|P1004R2}}
| version=c++2a
+
| version=c++20
 
}}
 
}}
  
Line 1,025: Line 1,023:
 
| feature=Input [[cpp/ranges|range adaptors]]
 
| feature=Input [[cpp/ranges|range adaptors]]
 
| reference={{wg21|P1035R7}}
 
| reference={{wg21|P1035R7}}
| version=c++2a
+
| version=c++20
 
}}
 
}}
  
Line 1,031: Line 1,029:
 
| feature=constexpr {{lc|std::invoke()}} and related utilities
 
| feature=constexpr {{lc|std::invoke()}} and related utilities
 
| reference={{wg21|P1065R2}}
 
| reference={{wg21|P1065R2}}
| version=c++2a
+
| version=c++20
 
| gcc={{yes|10}}
 
| gcc={{yes|10}}
 
}}
 
}}
Line 1,038: Line 1,036:
 
| feature=Atomic waiting and notifying, {{ltt|cpp/thread/counting_semaphore|std::counting_semaphore}}, {{ltt|cpp/thread/latch|std::latch}} and {{ltt|cpp/thread/barrier|std::barrier}}
 
| feature=Atomic waiting and notifying, {{ltt|cpp/thread/counting_semaphore|std::counting_semaphore}}, {{ltt|cpp/thread/latch|std::latch}} and {{ltt|cpp/thread/barrier|std::barrier}}
 
| reference={{wg21|P1135R6}}
 
| reference={{wg21|P1135R6}}
| version=c++2a
+
| version=c++20
 
}}
 
}}
  
Line 1,044: Line 1,042:
 
| feature={{ltt|cpp/utility/source_location|std::source_location}}
 
| feature={{ltt|cpp/utility/source_location|std::source_location}}
 
| reference={{wg21|P1208R6}}
 
| reference={{wg21|P1208R6}}
| version=c++2a
+
| version=c++20
 
| gcc={{maybe|7 (TS only)}}
 
| gcc={{maybe|7 (TS only)}}
 
}}
 
}}
Line 1,051: Line 1,049:
 
| feature=Adding {{tt|1=<=>}} to the standard library
 
| feature=Adding {{tt|1=<=>}} to the standard library
 
| reference={{wg21|P1614R2}}
 
| reference={{wg21|P1614R2}}
| version=c++2a
+
| version=c++20
 
}}
 
}}
 
}}
 
}}

Revision as of 02:18, 25 February 2020

C++20 core language features

C++20 feature

 
Paper(s)

 
GCC
Clang
MSVC
Apple Clang
EDG eccp
Intel C++
IBM XL C++
IBM Open XL C++ for AIX
IBM Open XL C++ for z/OS
Sun/Oracle C++
Embarcadero C++ Builder
Cray
Nvidia HPC C++ (ex PGI)*
Nvidia nvcc
Allow lambda-capture [=, this] P0409R2 8 6 19.22*

<span title=" unknown version number">10.0*</span>

5.1
__VA_OPT__ P0306R4
P1042R1
8 (partial)* 9

<span title=" unknown version number">10.0*</span>

5.1
Designated initializers P0329R4 4.7 (partial)*
8
3.0 (partial)*
10
19.21* 5.1
template-parameter-list for generic lambdas P0428R2 8 9 19.22* 5.1
Default member initializers for bit-fields P0683R1 8 6

<span title=" unknown version number">10.0*</span>

5.1
Initializer list constructors in class template argument deduction P0702R1 8 6 19.14* 5.0
const&-qualified pointers to members P0704R1 8 6 19.0 (2015)*

<span title=" unknown version number">10.0*</span>

5.1
Concepts P0734R0 6
(TS only)
10
10 19.23* (partial)*
Lambdas in unevaluated contexts P0315R4 9
Three-way comparison operator P0515R3 10 8 (partial)
10
19.20* 5.1
DR: Simplifying implicit lambda capture P0588R1 8 19.24* 5.1
init-statements for range-based for P0614R1 9 8

<span title=" unknown version number">11.0*</span>

6.0
Default constructible and assignable stateless lambdas P0624R2 9 8 19.22* 5.1
const mismatch with defaulted copy constructor P0641R2 9 8 19.21* (partial) 5.1
Access checking on specializations P0692R1 Yes 8 (partial) 5.1
ADL and function templates that are not visible P0846R0 9 9 19.21* 5.1
Less eager instantiation of constexpr functions P0859R0 5.2 (partial)*
9
Attributes [[likely]] and [[unlikely]] P0479R5 9 5.1
Make typename more optional P0634R3 9 5.1
Pack expansion in lambda init-capture P0780R2 9 9 19.22*
Attribute [[no_unique_address]] P0840R2 9 9 5.1
DR: Relaxing the structured bindings customization point finding rules P0961R1 8 8 19.21*

<span title=" unknown version number">10.0*</span>

5.1
DR: Relaxing the range-for loop customization point finding rules P0962R1 8 5.1
DR: Allow structured bindings to accessible members P0969R0 8 8 19.21*

<span title=" unknown version number">10.0*</span>

5.1
Destroying operator delete P0722R3 9 6

<span title=" unknown version number">10.0*</span>

6.1
Class types in non-type template parameters P0732R2 9
Deprecate implicit capture of this via [=] P0806R2 9 19.22* 5.1
explicit(bool) P0892R2 9 9 19.24* 5.1
Integrating feature-test macros P0941R2 5 3.4 19.15* (partial)
19.20*
5.0
Prohibit aggregates with user-declared constructors P1008R1 9 8 19.20*

<span title=" unknown version number">10.0*</span>

5.1
constexpr virtual function P1064R0 9 9 5.1
Consistency improvements for comparisons P1120R0 10 8 (partial)
10
19.22* 5.1
char8_t P0482R6 9 7 19.22* 5.1
std::is_constant_evaluated() P0595R2 9 9 5.1 19.1
constexpr try-catch blocks P1002R1 9 8

<span title=" unknown version number">10.0*</span>

5.1
Immediate functions P1073R3 10 (partial)* 5.1
Nested inline namespaces P1094R2 9 8 5.1
Yet another approach for constrained declarations P1141R2 10
Signed integers are two's complement P1236R1 9 9
constexpr dynamic_cast and polymorphic typeid P1327R1 10 9 5.1
Changing the active member of a union inside constexpr P1330R0 9 9 19.10* 5.1
Coroutines P0912R5 10 (partial) 8 (partial) 5.1
Parenthesized initialization of aggregates P0960R3 10 5.1
DR: Array size deduction in new-expressions P1009R2 9 5.1
Modules P1103R3 8 (partial)
Stronger Unicode requirements P1041R4
P1139R2
10 Yes N/A
<=> != == P1185R2 10 10 19.22* 5.1
DR: Explicitly defaulted functions with different exception specifications P1286R2 10 9 5.1
Lambda capture and storage class specifiers of structured bindings P1091R3
P1381R1
10 8 (partial) 5.1
Permit conversions to arrays of unknown bound P0388R4 10 6.0
constexpr container operations P0784R7 10 10 6.0
Deprecating some uses of volatile P1152R4 10 10 6.0
constinit P1143R2 10 10
Deprecate comma operator in subscripts P1161R3 10 9 6.0
[[nodiscard]] with message P1301R4 10 9 6.0
Trivial default initialization in constexpr functions P1331R2 10 10 6.0
Unevaluated asm-declaration in constexpr functions P1668R1 10 10 6.1
using enum P1099R5 19.24*
Synthesizing three-way comparison for specified comparison category P1186R3 10 10 19.24* 6.0
DR: [[nodiscard]] for constructors P1771R1 10 9 19.24* 6.0
Class template argument deduction for alias templates P1814R0 10
Class template argument deduction for aggregates P1816R0 10
DR: Implicit move for more local objects and rvalue references P1825R0 19.24* 6.0
 

C++20 feature
 

Paper(s)
GCC
Clang
MSVC
Apple Clang
EDG eccp
Intel C++
IBM XL C++
IBM Open XL C++ for AIX
IBM Open XL C++ for z/OS
Sun/Oracle C++
Embarcadero C++ Builder
Cray
Nvidia HPC C++ (ex PGI)*
Nvidia nvcc

C++20 library features

C++20 feature

 
Paper(s)

 
GCC libstdc++
Clang libc++
MSVC STL
Apple Clang*
IBM Open XL C/C++ for AIX*
Sun/Oracle C++*
Embarcadero C++ Builder*
std::endian P0463R1 8 7 19.22*


Extending std::make_shared() to support arrays P0674R1
Floating point atomic P0020R6 10 19.22*


Synchronized buffered ostream P0053R7


constexpr for <algorithm> and <utility> P0202R3 10 8 (partial)


More constexpr for <complex> P0415R1 9 7 (partial)


Make std::memory_order a scoped enumeration P0439R0 9 9


String prefix and suffix checking P0457R2 9 6 19.21*


Library support for operator<=> <compare> P0768R1 10 7 (partial) 19.20* (partial)


std::remove_cvref P0550R2 9 6 19.20*


[[nodiscard]] in the standard library P0600R1 9 7 (partial) 19.13* (partial)
19.22*


Using std::move in numeric algorithms P0616R0 9 19.23*


Utility to convert a pointer to a raw pointer P0653R2 8 6 19.22*


Atomic std::shared_ptr and std::weak_ptr P0718R2
std::span P0122R7 10 7


Calendar and timezone P0355R7 7 (partial)


<version> P0754R2 9 7 19.22*


Comparing unordered containers P0809R0 16.0*


ConstexprIterator requirements P0858R0 9 19.11*


std::basic_string::reserve() should not shrink P0966R1 8
std::atomic_ref P0019R8 10


contains() member function of associative containers P0458R2 9 19.21*


DR: Guaranteed copy elision for piecewise construction P0475R1 9


std::bit_cast() P0476R2


Integral power-of-2 operations P0556R3 9


Improving the return value of erase-like algorithms P0646R1 9 19.21*


std::destroying_delete P0722R3 9 9


std::is_nothrow_convertible P0758R1 9 9 19.23*


Add shift to <algorithm> P0769R2 19.21*


Constexpr for std::swap() and swap related functions P0879R0 10


std::type_identity P0887R1 9 8 19.21*


Concepts library P0898R3 10 19.23*


constexpr comparison operators for std::array P1023R0 10 8
std::unwrap_ref_decay and std::unwrap_reference P0318R1 9 8 19.21*


std::bind_front() P0356R5 9


std::reference_wrapper for incomplete types P0357R3 9 8


Fixing operator>>(basic_istream&, CharT*) P0487R1 8 19.23*


Library support for char8_t P0482R6 9 19.22*


Utility functions to implement uses-allocator construction P0591R4 9


DR: std::variant and std::optional should propagate copy/move triviality P0602R4 8.3 8 19.11*


A sane std::variant converting constructor P0608R3 10 9


std::function's move constructor should be noexcept P0771R1 7.2 6 19.22*


The One Ranges Proposal P0896R4


Heterogeneous lookup for unordered containers P0919R3 19.23*


<chrono> zero(), min(), and max() should be noexcept P0972R0 9 8 19.14*


constexpr in std::pointer_traits P1006R1 9 8


std::assume_aligned() P1007R3 9


Remove comparison operators of std::span P1085R2 10 8


Make stateful allocator propagation more consistent for operator+(basic_string) P1165R1 10


Consistent container erasure P1209R0 9 8
std::lerp() and std::midpoint() P0811R3 9 9


Usability enhancements for std::span P1024R3 10 9


DR: Make create_directory() Intuitive P1164R1 8.3 19.20*


std::ssize() and unsigned extent for std::span P1227R2 10 9


Traits for (un)bounded arrays P1357R0 9 9
std::to_array() P0325R4 10


Efficient access to std::basic_stringbuf’s Buffer P0408R7


Layout-compatibility and pointer-interconvertibility traits P0466R5


Bit operations P0553R4 9 9


Mathematical constants P0631R8 10


Text formatting P0645R10


std::stop_token and std::jthread P0660R10 10


constexpr std::allocator and related utilities P0784R7 10


constexpr std::string P0980R1


constexpr std::vector P1004R2


Input range adaptors P1035R7


constexpr std::invoke() and related utilities P1065R2 10


Atomic waiting and notifying, std::counting_semaphore, std::latch and std::barrier P1135R6


std::source_location P1208R6 7 (TS only)


Adding <=> to the standard library P1614R2
 

C++20 feature
 

Paper(s)
GCC libstdc++
Clang libc++
MSVC STL
Apple Clang*
IBM Open XL C/C++ for AIX*
Sun/Oracle C++*
Embarcadero C++ Builder*