Feature-Tests (seit C++20)
Der Standard definiert eine Reihe von Präprozessor-Makros, die C++-Sprach- und Bibliotheksfeatures entsprechen, die in C++11 oder später eingeführt wurden. Sie sind als einfache und portable Möglichkeit gedacht, die Anwesenheit dieser Features zu erkennen.
Inhalt |
[bearbeiten] Attribute
__has_cpp_attribute( attribut-token ) |
|||||||||
Prüft auf die Unterstützung eines durch attribut-token (nach Makroexpansion) benannten Attributs.
Für jedes Standardattribut ist es implementierungsabhängig, ob __has_cpp_attribute zu dem unten in der Tabelle angegebenen Wert (dem Jahr und Monat, in dem das Attribut zum Arbeitsentwurf hinzugefügt wurde) oder zu 0 expandiert. Es expandiert nur dann zu dem in der Tabelle angegebenen Wert, wenn das Standardattribut die Implementierung dazu veranlasst, sich wie empfohlen zu verhalten (Diagnosemeldungen auszugeben, das Klassenschema zu beeinflussen usw.).
Die Anwesenheit herstellerspezifischer Attribute wird durch einen von Null verschiedenen Wert bestimmt.
__has_cpp_attribute kann im Ausdruck von #if und #elif expandiert werden. Es wird von #ifdef, #ifndef, #elifdef, #elifndef(seit C++23) und defined als definiertes Makro behandelt, kann aber nirgendwo sonst verwendet werden.
| attribut-token | Attribut | Wert | Std | Papier(e) |
|---|---|---|---|---|
assume
|
[[assume]]
|
202207L
|
(C++23) | P1774R8 |
carries_dependency
|
[[carries_dependency]]
|
200809L
|
(C++11) (bis C++26) |
N2556 N2643 P3475R2 |
deprecated
|
[[deprecated]]
|
201309L
|
(C++14) | N3760 |
fallthrough
|
[[fallthrough]]
|
201603L
|
(C++17) | P0188R1 |
indeterminate
|
[[indeterminate]]
|
202403L
|
(C++26) | P2795R5 |
likely
|
[[likely]]
|
201803L
|
(C++20) | P0479R5 |
maybe_unused
|
[[maybe_unused]]
|
201603L
|
(C++17) | P0212R1 |
no_unique_address
|
[[no_unique_address]]
|
201803L
|
(C++20) | P0840R2 |
nodiscard
|
[[nodiscard]]
|
201603L
|
(C++17) | P0189R1 |
[[nodiscard]] mit Begründung |
201907L
|
(C++20) | P1301R4 | |
noreturn
|
[[noreturn]]
|
200809L
|
(C++11) | N2761 |
unlikely
|
[[unlikely]]
|
201803L
|
(C++20) | P0479R5 |
| Gesamtzahl der Attribute: 11 | ||||
[bearbeiten] Sprachfeatures
Die folgenden Makros können verwendet werden, um zu erkennen, ob ein Sprachfeature von der aktuellen Implementierung unterstützt wird. Sie sind in jeder Übersetzungseinheit vordefiniert.
Jedes Makro expandiert zu einem ganzzahligen Literal, das dem Jahr und Monat entspricht, in dem das entsprechende Feature in den Arbeitsentwurf aufgenommen wurde. Wenn sich ein Feature erheblich ändert, wird das Makro entsprechend aktualisiert.
| Makroname | Feature | Wert | Std | Papier(e) |
|---|---|---|---|---|
__cpp_aggregate_bases
|
Aggregatklassen mit Basisklassen | 201603L
|
(C++17) | P0017R1 |
__cpp_aggregate_nsdmi
|
Aggregatklassen mit Standard-Member-Initialisierern | 201304L
|
(C++14) | N3653 |
__cpp_aggregate_paren_init
|
Aggregatinitialisierung in Form der direkten Initialisierung | 201902L
|
(C++20) | P0960R3 |
__cpp_alias_templates
|
Alias-Templates | 200704L
|
(C++11) | N2258 |
__cpp_aligned_new
|
Dynamische Speicherzuweisung für übermäßig ausgerichtete Daten | 201606L
|
(C++17) | P0035R4 |
__cpp_attributes
|
Attribute | 200809L
|
(C++11) | N2761 |
__cpp_auto_cast
|
auto(x) und auto{x} | 202110L
|
(C++23) | P0849R8 |
__cpp_binary_literals
|
Binäre Literale | 201304L
|
(C++14) | N3472 |
__cpp_capture_star_this
|
Lambda-Erfassung von *this per Wert als [=,*this] | 201603L
|
(C++17) | P0018R3 |
__cpp_char8_t
|
char8_t | 201811L
|
(C++20) | P0482R6 |
| char8_t Kompatibilität und Portabilitätskorrektur (Zulassung der Initialisierung von (unsigned) char-Arrays aus UTF-8-Zeichenkettenliteralen) | 202207L
|
(C++23) (DR20) |
P2513R4 | |
__cpp_concepts
|
Konzepte | 201907L
|
(C++20) | P0734R0 P1084R2 P1452R2 |
| Bedingte triviale spezielle Memberfunktionen | 202002L
|
P0848R3 P2493R0 | ||
__cpp_conditional_explicit
|
explicit(bool)
|
201806L
|
(C++20) | P0892R2 |
__cpp_consteval
|
Sofortfunktionen | 201811L
|
(C++20) | P1073R3 |
| Weitergabe von consteval nach oben | 202211L
|
(C++23) (DR20) |
P2564R3 | |
__cpp_constexpr
|
constexpr | 200704L
|
(C++11) | N2235 |
Entspannte constexpr, nicht-const constexpr-Methoden |
201304L
|
(C++14) | N3652 | |
| Constexpr-Lambda | 201603L
|
(C++17) | P0170R1 | |
Virtuelle Funktionsaufrufe in konstanten Ausdrücken; try-Blöcke in constexpr-Funktionen, dynamic_cast und polymorphe typeid in konstanten Ausdrücken; triviale Standardinitialisierung und asm-Deklarationen in constexpr-Funktionen |
201907L
|
(C++20) | P1064R0 P1002R1 P1327R1 P1331R2 P1668R1 | |
| Änderung des aktiven Mitglieds einer Union in konstanter Auswertung | 202002L
|
P1330R0 P2493R0 | ||
| Nicht-Literaltypen-Variablen, Sprungmarken und goto-Anweisungen in constexpr-Funktionen | 202110L
|
(C++23) | P2242R3 | |
| Lockerung einiger Beschränkungen für constexpr-Funktionen und Funktionstemplates | 202207L
|
P2448R2 | ||
| Zulassung von statischen constexpr-Variablen in constexpr-Funktionen | 202211L
|
P2647R1 | ||
| Constexpr-Cast von void*: Richtung constexpr Type-Erasure | 202306L
|
(C++26) | P2738R1 | |
| constexpr Placement new | 202406L
|
P2747R2 | ||
__cpp_constexpr_dynamic_alloc
|
Operationen für dynamische Speicherverwaltung in constexpr-Funktionen | 201907L
|
(C++20) | P0784R7 |
__cpp_constexpr_exceptions
|
constexpr Ausnahmen | 202411L
|
(C++26) | P3068R6 |
__cpp_constexpr_in_decltype
|
Generierung von Funktions- und Variablendefinitionen, wenn für die konstante Auswertung benötigt | 201711L
|
(C++20) (DR11) |
P0859R0 |
__cpp_constinit
|
constinit | 201907L
|
(C++20) | P1143R2 |
__cpp_contracts
|
Verträge | 202502L
|
(C++26) | P2900R14 |
__cpp_decltype
|
decltype | 200707L
|
(C++11) | N2343 |
__cpp_decltype_auto
|
Rückgabetyp-Deduktion für normale Funktionen | 201304L
|
(C++14) | N3638 |
__cpp_deduction_guides
|
Template-Argument-Deduktion für Klassentemplates (CTAD) | 201703L
|
(C++17) | P0091R3 P0512R0 P0620R0 |
| CTAD für Aggregate und Aliase | 201907L
|
(C++20) | P1814R0 P1816R0 | |
__cpp_delegating_constructors
|
Delegierende Konstruktoren | 200604L
|
(C++11) | N1986 |
__cpp_deleted_function
|
Gelöschte Funktionsdefinitionen mit Nachrichten (= delete("sollte einen Grund haben");) | 202403L
|
(C++26) | P2573R2 |
__cpp_designated_initializers
|
Bezeichner-Initialisierer | 201707L
|
(C++20) | P0329R4 |
__cpp_enumerator_attributes
|
Attribute für Aufzählungswerte | 201411L
|
(C++17) | N4266 |
__cpp_explicit_this_parameter
|
Expliziter Objektparameter | 202110L
|
(C++23) | P0847R7 |
__cpp_fold_expressions
|
Falt-Ausdrücke | 201603L
|
(C++17) | N4295 P0036R0 |
| Reihenfolge von Bedingungen, die Falt-Ausdrücke beinhalten | 202406L
|
(C++26) | P2963R3 | |
__cpp_generic_lambdas
|
Generische Lambda-Ausdrücke | 201304L
|
(C++14) | N3649 |
| Explizite Template-Parameterliste für generische Lambdas | 201707L
|
(C++20) | P0428R2 | |
__cpp_guaranteed_copy_elision
|
Garantierte Kopierelision durch vereinfachte Wertkategorien | 201606L
|
(C++17) | P0135R1 |
__cpp_hex_float
|
Hexadezimale Gleitkommazahlenliterale | 201603L
|
(C++17) | P0245R1 |
__cpp_if_consteval
|
if consteval
|
202106L
|
(C++23) | P1938R3 |
__cpp_if_constexpr
|
if constexpr
|
201606L
|
(C++17) | P0292R2 |
__cpp_impl_coroutine
|
Coroutinen (Compiler-Unterstützung) | 201902L
|
(C++20) | P0912R5 LWG3393 |
__cpp_impl_destroying_delete
|
Zerstörendes operator delete (Compiler-Unterstützung) |
201806L
|
(C++20) | P0722R3 |
__cpp_impl_three_way_comparison
|
Drei-Wege-Vergleich (Compiler-Unterstützung) | 201907L
|
(C++20) | P0515R3 P0768R1 P1185R2 P1630R1 |
__cpp_implicit_move
|
Einfacheres implizites Verschieben | 202207L
|
(C++23) | P2266R3 |
__cpp_inheriting_constructors
|
Erbende Konstruktoren | 200802L
|
(C++11) | N2540 |
| Umschreibung erbender Konstruktoren: Neue Spezifikation für erbende Konstruktoren (DR1941 et al) | 201511L
|
(C++17) (DR11) |
P0136R1 | |
__cpp_init_captures
|
Lambda-Init-Capture | 201304L
|
(C++14) | N3648 |
| Paketexpansion in der Lambda-Init-Capture zulassen | 201803L
|
(C++20) | P0780R2 | |
__cpp_initializer_lists
|
Listeninitialisierung und std::initializer_list | 200806L
|
(C++11) | N2672 |
__cpp_inline_variables
|
Inline-Variablen | 201606L
|
(C++17) | P0386R2 |
__cpp_lambdas
|
Lambda-Ausdrücke | 200907L
|
(C++11) | N2927 |
__cpp_modules
|
Module | 201907L
|
(C++20) | P1103R3 P1811R0 |
__cpp_multidimensional_subscript
|
Mehrdimensionierter Subscript-Operator | 202110L
|
(C++23) | P2128R6 |
| Statisches operator[] | 202211L
|
P2589R1 | ||
__cpp_named_character_escapes
|
Benannte universelle Zeichen-Escapes | 202207L
|
(C++23) | P2071R2 |
__cpp_namespace_attributes
|
Attribute für Namensräume | 201411L
|
(C++17) | N4266 |
__cpp_noexcept_function_type
|
Ausnahmespezifikationen als Teil des Typsystems machen | 201510L
|
(C++17) | P0012R1 |
__cpp_nontype_template_args
|
Konstante Auswertung für alle Nicht-Typ-Template-Argumente zulassen | 201411L
|
(C++17) | N4268 |
| Klassentypen und Gleitkommatypen in Nicht-Typ-Template-Parametern | 201911L
|
(C++20) | P1907R1 | |
__cpp_nontype_template_parameter_auto
|
Deklaration eines Nicht-Typ-Template-Parameters mit auto | 201606L
|
(C++17) | P0127R2 |
__cpp_nsdmi
|
Nicht-statische Member-Initialisierer | 200809L
|
(C++11) | N2756 |
__cpp_pack_indexing
|
Paketindizierung | 202311L
|
(C++26) | P2662R3 |
__cpp_placeholder_variables
|
Ein schönes Platzhalter ohne Namen | 202306L
|
(C++26) | P2169R4 |
__cpp_pp_embed
|
#embed | 202502L
|
(C++26) | P1967R14 |
__cpp_range_based_for
|
Bereichsbasierte for-Schleife
|
200907L
|
(C++11) | N2930 |
Bereichsbasierte for-Schleife mit unterschiedlichen begin/end-Typen |
201603L
|
(C++17) | P0184R0 | |
| Lebensdauerverlängerung in bereichsbasierten for-Schleifen | 202211L
|
(C++23) | P2644R1 P2718R0 CWG2659 | |
__cpp_raw_strings
|
Rohe Zeichenkettenliterale | 200710L
|
(C++11) | N2442 |
__cpp_ref_qualifiers
|
Referenz-Qualifizierer | 200710L
|
(C++11) | N2439 |
__cpp_return_type_deduction
|
Rückgabetyp-Deduktion für normale Funktionen | 201304L
|
(C++14) | N3638 |
__cpp_rvalue_references
|
Rvalue-Referenz | 200610L
|
(C++11) | N2118 |
__cpp_size_t_suffix
|
Literal-Suffixe für std::size_t und seine vorzeichenbehaftete Version
|
202011L
|
(C++23) | P0330R8 |
__cpp_sized_deallocation
|
Größenabhängige Deallokation | 201309L
|
(C++14) | N3778 |
__cpp_static_assert
|
static_assert | 200410L
|
(C++11) | N1720 |
static_assert mit einem Argument
|
201411L
|
(C++17) | N3928 | |
Vom Benutzer generierte static_assert-Nachrichten
|
202306L
|
(C++26) | P2741R3 | |
__cpp_static_call_operator
|
Statischer operator() | 202207L
|
(C++23) | P1169R4 |
__cpp_structured_bindings
|
Strukturierte Bindungen | 201606L
|
(C++17) | P0217R3 |
| Attribute für strukturierte Bindungen | 202403L
|
(C++26) | P0609R3 | |
| Strukturierte Bindungen als Bedingung in Deklarationen einführen | 202406L
|
P0963R3 | ||
| Strukturierte Bindungen können ein Paket einführen | 202411L
|
P1061R10 | ||
__cpp_template_parameters
|
Konzepte und Variablentemplate-Parameter | 202502L
|
(C++26) | P2841R7 |
__cpp_template_template_args
|
Abgleich von Template-Template-Argumenten | 201611L
|
(C++17) | P0522R0 |
__cpp_threadsafe_static_init
|
Dynamische Initialisierung und Zerstörung mit Nebenläufigkeit | 200806L
|
(C++11) | N2660 |
__cpp_trivial_relocatability
|
Triviale Verlagerbarkeit | 202502L
|
(C++26) | P2786R13 |
__cpp_trivial_union
|
Triviale Unions | 202502L
|
(C++26) | P3074R7 |
__cpp_unicode_characters
|
Neue Zeichentypen (char16_t und char32_t) | 200704L
|
(C++11) | N2249 |
__cpp_unicode_literals
|
Unicode-String-Literale | 200710L
|
(C++11) | N2442 |
__cpp_user_defined_literals
|
Benutzerdefinierte Literale | 200809L
|
(C++11) | N2765 |
__cpp_using_enum
|
using enum | 201907L
|
(C++20) | P1099R5 |
__cpp_variable_templates
|
Variablentemplates | 201304L
|
(C++14) | N3651 |
__cpp_variadic_friend
|
Variadische friend-Deklarationen | 202403L
|
(C++26) | P2893R3 |
__cpp_variadic_templates
|
Variadische Templates | 200704L
|
(C++11) | N2242 |
__cpp_variadic_using
|
Paketexpansion in using-Deklarationen |
201611L
|
(C++17) | P0195R2 |
| Gesamtzahl der Makros: 76 | ||||
[bearbeiten] Bibliotheksfeatures
Die folgenden Makros können verwendet werden, um zu erkennen, ob ein Standardbibliotheksfeature von der aktuellen Implementierung unterstützt wird. Im Gegensatz zu den Sprachfeature-Testmakros sind sie nicht vordefiniert. Stattdessen werden sie vom Header <version> bereitgestellt.
Für jedes Bibliotheksfeature-Testmakro wird es auch von den Headern bereitgestellt, die die entsprechenden Standardbibliothekskomponenten enthalten. Eine vollständige Liste der Header, die diese Makros bereitstellen, finden Sie unter Bibliotheksfeature-Testmakros.
Jedes Makro expandiert zu einem ganzzahligen Literal, das dem Jahr und Monat entspricht, in dem das entsprechende Feature in den Arbeitsentwurf aufgenommen wurde. Wenn sich ein Feature erheblich ändert, wird das Makro entsprechend aktualisiert.
| Makroname | Feature | Wert | Std | Papier(e) |
|---|---|---|---|---|
__cpp_lib_adaptor_iterator_pair_constructor
|
Iterator-Paar-Konstruktoren für std::stack und std::queue | 202106L
|
(C++23) | P1425R4 |
__cpp_lib_addressof_constexpr
|
Constexpr std::addressof | 201603L
|
(C++17) | LWG2296 |
__cpp_lib_algorithm_default_value_type
|
Aktivierung von Listeninitialisierung für Algorithmen | 202403L
|
(C++26) | P2248R8 P3217R0 |
__cpp_lib_algorithm_iterator_requirements
|
Ranges-Iteratoren als Eingaben für Nicht-Ranges-Algorithmen | 202207L
|
(C++23) | P2408R5 |
__cpp_lib_aligned_accessor
|
std::aligned_accessor: Ein std::mdspan-Accessor, der Pointer-Über-Ausrichtung ausdrückt | 202411L
|
(C++26) | P2897R7 |
__cpp_lib_allocate_at_least
|
Größenrückmeldung in der Allocator-Schnittstelle, z.B.: std::allocator::allocate_at_least, std::allocator_traits::allocate_at_least | 202302L
|
(C++23) | P0401R6 P2652R2 LWG3887 |
__cpp_lib_allocator_traits_is_always_equal
|
std::allocator_traits::is_always_equal, noexcept Bereinigungen | 201411L
|
(C++17) | N4258 |
__cpp_lib_any
|
std::any | 201606L
|
(C++17) | P0220R1 P0032R3 |
__cpp_lib_apply
|
std::apply | 201603L
|
(C++17) | P0220R1 |
__cpp_lib_array_constexpr
|
Constexpr für std::reverse_iterator, std::move_iterator, std::array und Bereichszugriff | 201603L
|
(C++17) | P0031R0 |
| ConstexprIterator; constexpr Vergleich für std::array; diverse constexpr Bits (std::array::fill usw.) | 201811L
|
(C++20) | P0858R0 LWG3257 P1023R0 P1032R1 | |
__cpp_lib_as_const
|
std::as_const | 201510L
|
(C++17) | P0007R1 |
__cpp_lib_associative_heterogeneous_erasure
|
Heterogene Löschung in assoziativen Containern und ungeordneten assoziativen Containern | 202110L
|
(C++23) | P2077R3 |
__cpp_lib_associative_heterogeneous_insertion
|
Heterogene Überladungen für die verbleibenden Memberfunktionen in geordneten und ungeordneten assoziativen Containern | 202306L
|
(C++26) | P2363R5 |
__cpp_lib_assume_aligned
|
std::assume_aligned | 201811L
|
(C++20) | P1007R3 |
__cpp_lib_atomic_flag_test
|
std::atomic_flag::test | 201907L
|
(C++20) | P1135R6 |
__cpp_lib_atomic_float
|
Atomare Gleitkommazahlen | 201711L
|
(C++20) | P0020R6 |
__cpp_lib_atomic_is_always_lock_free
|
Constexpr std::atomic<T>::is_always_lock_free | 201603L
|
(C++17) | P0152R1 |
__cpp_lib_atomic_lock_free_type_aliases
|
Atomare lock-free ganzzahlige Typen (std::atomic_signed_lock_free, std::atomic_unsigned_lock_free) | 201907L
|
(C++20) | P1135R6 |
__cpp_lib_atomic_min_max
|
Atomares Minimum/Maximum (std::atomic::fetch_min, std::atomic::fetch_max, etc.) | 202403L
|
(C++26) | P0493R5 |
__cpp_lib_atomic_ref
|
std::atomic_ref | 201806L
|
(C++20) | P0019R8 |
| std::atomic_ref::address() | 202411L
|
(C++26) | P2835R7 | |
__cpp_lib_atomic_shared_ptr
|
std::atomic<std::shared_ptr> | 201711L
|
(C++20) | P0718R2 |
__cpp_lib_atomic_value_initialization
|
Korrektur der atomaren Initialisierung (standardmäßig Werteinitialisierung von std::atomic) | 201911L
|
(C++20) | P0883R2 |
__cpp_lib_atomic_wait
|
Effizientes Warten auf std::atomic | 201907L
|
(C++20) | P1135R6 |
__cpp_lib_barrier
|
std::barrier | 201907L
|
(C++20) | P1135R6 |
| std::barrier's Garantien für Phasenabschluss | 202302L
|
(C++23) | P2588R3 | |
__cpp_lib_bind_back
|
std::bind_back | 202202L
|
(C++23) | P2387R3 |
| Zulassung der Übergabe von aufrufbaren Objekten als Nicht-Typ-Template-Argumente an std::bind_back | 202306L
|
(C++26) | P2714R1 | |
__cpp_lib_bind_front
|
std::bind_front | 201907L
|
(C++20) | P0356R5 P1651R0 |
| Zulassung der Übergabe von aufrufbaren Objekten als Nicht-Typ-Template-Argumente an std::bind_front | 202306L
|
(C++26) | P2714R1 | |
__cpp_lib_bit_cast
|
std::bit_cast | 201806L
|
(C++20) | P0476R2 |
__cpp_lib_bitops
|
Bitoperationen | 201907L
|
(C++20) | P0553R4 |
__cpp_lib_bitset
|
Schnittstelle std::bitset mit std::string_view | 202306L
|
(C++26) | P2697R1 |
__cpp_lib_bool_constant
|
std::bool_constant | 201505L
|
(C++17) | N4389 |
__cpp_lib_bounded_array_traits
|
std::is_bounded_array, std::is_unbounded_array | 201902L
|
(C++20) | P1357R1 |
__cpp_lib_boyer_moore_searcher
|
Sucher | 201603L
|
(C++17) | P0220R1 |
__cpp_lib_byte
|
std::byte | 201603L
|
(C++17) | P0298R3 |
__cpp_lib_byteswap
|
std::byteswap | 202110L
|
(C++23) | P1272R4 |
__cpp_lib_char8_t
|
Bibliotheksunterstützung für char8_t |
201907L
|
(C++20) | P0482R6 P1423R3 |
__cpp_lib_chrono
|
Rundungsfunktionen für std::chrono::duration und std::chrono::time_point | 201510L
|
(C++17) | P0092R1 |
| Constexpr für alle Memberfunktionen von std::chrono::duration und std::chrono::time_point | 201611L
|
P0505R0 | ||
| Kalender und Zeitzonen | 201907L
|
(C++20) | P0355R7 P1466R3 | |
| Hashing-Unterstützung für std::chrono-Wertklassen | 202306L
|
(C++26) | P2592R3 | |
__cpp_lib_chrono_udls
|
Benutzerdefinierte Literale für Zeit-Typen | 201304L
|
(C++14) | N3642 |
__cpp_lib_clamp
|
std::clamp | 201603L
|
(C++17) | P0025R1 |
__cpp_lib_common_reference
|
std::common_reference_t von std::reference_wrapper zu einem Referenztyp machen |
202302L
|
(C++23) | P2655R3 |
__cpp_lib_common_reference_wrapper
|
std::common_reference_t von std::reference_wrapper zu einem Referenztyp machen |
202302L
|
(C++23) | P2655R3 |
__cpp_lib_complex_udls
|
Benutzerdefinierte Literale für std::complex
|
201309L
|
(C++14) | N3779 |
__cpp_lib_concepts
|
Standardbibliothekskonzepte | 202002L
|
(C++20) | P0898R3 P1754R1 P1964R2 |
Nur-verschieb-Typen für equality_comparable_with, totally_ordered_with und three_way_comparable_with |
202207L
|
(C++23) | P2404R3 | |
__cpp_lib_constexpr_algorithms
|
Constexpr für Algorithmen | 201806L
|
(C++20) | P0202R3 P0879R0 LWG3256 LWG3792 |
| Constexpr-stabile Sortierung | 202306L
|
(C++26) | P2562R1 | |
__cpp_lib_constexpr_atomic
|
constexpr std::atomic und std::atomic_ref | 202411L
|
(C++26) | P3309R3 |
__cpp_lib_constexpr_bitset
|
Ein noch mehr constexpres std::bitset | 202207L
|
(C++23) | P2417R2 |
__cpp_lib_constexpr_charconv
|
Constexpr für std::to_chars und std::from_chars für ganzzahlige Typen | 202207L
|
(C++23) | P2291R3 |
__cpp_lib_constexpr_cmath
|
Constexpr für mathematische Funktionen in <cmath> und <cstdlib> | 202202L
|
(C++23) | P0533R9 |
| Mehr constexpr für <cmath> | 202306L
|
(C++26) | P1383R2 | |
__cpp_lib_constexpr_complex
|
Constexpr für std::complex | 201711L
|
(C++20) | P0415R1 |
| Mehr constexpr für <complex> | 202306L
|
(C++26) | P1383R2 | |
__cpp_lib_constexpr_containers
|
Mehr constexpr Container und Adaptoren | 202502L
|
(C++26) | P3372R2 |
__cpp_lib_constexpr_dynamic_alloc
|
Constexpr für std::allocator und verwandte Dienstprogramme | 201907L
|
(C++20) | P0784R7 |
__cpp_lib_constexpr_exceptions
|
constexpr für Ausnahmetypen, z.B. std::bad_alloc, std::bad_cast etc. | 202411L
|
(C++26) | P3068R6 |
| Mehr constexpr für Ausnahmetypen | 202502L
|
P3378R2 | ||
__cpp_lib_constexpr_functional
|
Diverse constexpr Bits (std::default_searcher); constexpr INVOKE |
201907L
|
(C++20) | P1032R1 P1065R2 |
__cpp_lib_constexpr_inplace_vector
|
constexpr std::inplace_vector für nicht-triviale Typen | 202502L
|
(C++26) | P3074R7 |
__cpp_lib_constexpr_iterator
|
Diverse constexpr Bits (std::insert_iterator usw.) | 201811L
|
(C++20) | P1032R1 |
__cpp_lib_constexpr_memory
|
Constexpr in std::pointer_traits | 201811L
|
(C++20) | P1006R1 |
| Constexpr std::unique_ptr | 202202L
|
(C++23) | P2273R3 | |
__cpp_lib_constexpr_new
|
Constexpr Placement new | 202406L
|
(C++26) | P2747R2 |
__cpp_lib_constexpr_numeric
|
Constexpr für Algorithmen in <numeric> | 201911L
|
(C++20) | P1645R1 |
__cpp_lib_constexpr_string
|
constexpr std::char_traits | 201611L
|
(C++17) | P0426R1 |
| constexpr std::string | 201907L
|
(C++20) | P0980R1 | |
__cpp_lib_constexpr_string_view
|
Diverse constexpr Bits (std::string_view::copy) | 201811L
|
(C++20) | P1032R1 |
__cpp_lib_constexpr_tuple
|
Diverse constexpr Bits (std::tuple::operator= usw.) | 201811L
|
(C++20) | P1032R1 |
__cpp_lib_constexpr_typeinfo
|
Constexpr für std::type_info::operator== | 202106L
|
(C++23) | P1328R1 |
__cpp_lib_constexpr_utility
|
Diverse constexpr Bits (std::pair::operator= usw.) | 201811L
|
(C++20) | P1032R1 |
__cpp_lib_constexpr_vector
|
Constexpr für std::vector | 201907L
|
(C++20) | P1004R2 |
__cpp_lib_constrained_equality
|
Beschränkte relationale Operatoren für std::pair, std::tuple, std::optional und std::variant | 202403L
|
(C++26) | P2944R3 |
| Beschränkung der Gleichheitsoperatoren von std::expected | 202411L
|
P3379R0 | ||
__cpp_lib_containers_ranges
|
Ranges-fähige Konstruktion und Einfügung für Container und Strings | 202202L
|
(C++23) | P1206R7 |
__cpp_lib_contracts
|
<contracts>: Contracts-Unterstützung | 202502L
|
(C++26) | P2900R14 |
__cpp_lib_copyable_function
|
std::copyable_function | 202306L
|
(C++26) | P2548R6 |
__cpp_lib_coroutine
|
Coroutinen (Bibliotheksunterstützung) | 201902L
|
(C++20) | P0912R5 LWG3393 |
__cpp_lib_debugging
|
<debugging>: Debugging-Unterstützung | 202311L
|
(C++26) | P2546R5 |
| Ersetzbares std::is_debugger_present | 202403L
|
P2810R4 | ||
__cpp_lib_destroying_delete
|
Zerstörendes operator delete (Bibliotheksunterstützung) | 201806L
|
(C++20) | P0722R3 |
__cpp_lib_enable_shared_from_this
|
std::enable_shared_from_this::weak_from_this | 201603L
|
(C++17) | P0033R1 |
__cpp_lib_endian
|
std::endian | 201907L
|
(C++20) | P0463R1 P1612R1 |
__cpp_lib_erase_if
|
Einheitliche Containerlöschung | 202002L
|
(C++20) | P1209R0 P1115R3 |
__cpp_lib_exchange_function
|
std::exchange | 201304L
|
(C++14) | N3668 |
__cpp_lib_execution
|
Ausführungsrichtlinien | 201603L
|
(C++17) | P0024R2 |
| std::execution::unsequenced_policy | 201902L
|
(C++20) | P1001R2 | |
__cpp_lib_expected
|
Klassentemplate std::expected | 202202L
|
(C++23) | P0323R12 |
| Monadische Funktionen für std::expected | 202211L
|
P2505R5 | ||
__cpp_lib_filesystem
|
Dateisystem-Bibliothek | 201703L
|
(C++17) | P0218R1 P0219R1 P0392R0 P0317R1 |
__cpp_lib_flat_map
|
std::flat_map und std::flat_multimap | 202207L
|
(C++23) | P0429R9 |
__cpp_lib_flat_set
|
std::flat_set und std::flat_multiset | 202207L
|
(C++23) | P1222R4 LWG3751 |
__cpp_lib_format
|
Textformatierung | 201907L
|
(C++20) | P0645R10 P1361R2 P1652R1 |
| Compile-Zeit-Prüfung von Format-Strings; Reduzierung der Parametrisierung von std::vformat_to | 202106L
|
(C++23) (DR20) |
P2216R3 | |
| Behebung der Locale-Behandlung bei Chrono-Formatierern; Unterstützung von nicht-konstant-formatierbaren Typen | 202110L
|
P2372R3 P2418R2 | ||
| Offenlegung von std::basic_format_string; Klärung der Handhabung von Encodings bei lokalisierter Formatierung von Chrono-Typen | 202207L
|
(C++23) | P2419R2 P2508R1 | |
| Formatierung von Zeigern | 202304L
|
(C++26) | P2510R3 | |
| Typ-Prüfung von Format-Argumenten | 202305L
|
P2757R3 | ||
| Member visit | 202306L
|
P2637R3 | ||
| Laufzeit-Format-Strings | 202311L
|
P2918R2 | ||
__cpp_lib_format_path
|
Formatierung von std::filesystem::path | 202403L
|
(C++26) | P2845R8 |
__cpp_lib_format_ranges
|
Formatierung von Bereichen (Ranges) | 202207L
|
(C++23) | P2286R8 P2585R1 LWG3750 |
__cpp_lib_format_uchar
|
Korrektur der Formatierung von Code-Einheiten als Ganzzahlen | 202311L
|
(C++26) | P2909R4 |
__cpp_lib_formatters
|
Formatierung von std::thread::id und std::stacktrace | 202302L
|
(C++23) | P2693R1 |
__cpp_lib_forward_like
|
std::forward_like | 202207L
|
(C++23) | P2445R1 |
__cpp_lib_freestanding_algorithm
|
Freistehende Einrichtungen in <algorithm> | 202311L
|
(C++26) | P2407R5 |
__cpp_lib_freestanding_array
|
Machen Sie Teile von std::array "freestanding" | 202311L
|
(C++26) | P2407R5 |
__cpp_lib_freestanding_char_traits
|
Freestanding std::char_traits | 202306L
|
(C++26) | P2338R4 |
__cpp_lib_freestanding_charconv
|
Freestanding-Funktionen in <charconv> | 202306L
|
(C++26) | P2338R4 |
__cpp_lib_freestanding_cstdlib
|
Freestanding-Funktionen in <cstdlib> | 202306L
|
(C++26) | P2338R4 |
__cpp_lib_freestanding_cstring
|
Freestanding-Funktionen in <cstring> | 202306L
|
(C++26) | P2338R4 |
| Entfernen von std::strtok aus Freestanding-Funktionen | 202311L
|
P2937R0 | ||
__cpp_lib_freestanding_cwchar
|
Freestanding-Funktionen in <cwchar> | 202306L
|
(C++26) | P2338R4 |
__cpp_lib_freestanding_errc
|
Freestanding std::errc | 202306L
|
(C++26) | P2338R4 |
__cpp_lib_freestanding_expected
|
Machen Sie Teile von std::expected "freestanding" | 202311L
|
(C++26) | P2833R2 |
__cpp_lib_freestanding_feature_test_macros
|
Unterstützung für "freestanding" Feature-Test-Makros | 202306L
|
(C++26) | P2198R7 |
__cpp_lib_freestanding_functional
|
Freestanding-Funktionen in <functional> | 202306L
|
(C++26) | P2198R7 |
__cpp_lib_freestanding_iterator
|
Freestanding-Funktionen in <iterator> | 202306L
|
(C++26) | P2198R7 |
__cpp_lib_freestanding_mdspan
|
Freestanding std::mdspan | 202311L
|
(C++26) | P2833R2 |
__cpp_lib_freestanding_memory
|
Freestanding-Funktionen in <memory> | 202306L
|
(C++26) | P2198R7 |
__cpp_lib_freestanding_numeric
|
Freestanding-Funktionen in <numeric> (Sättigungsarithmetik) | 202311L
|
(C++26) | P0543R3 |
__cpp_lib_freestanding_operator_new
|
Definition von operator new (optional in "freestanding" Implementierungen) | 202306L
|
(C++26) | P2198R7 |
__cpp_lib_freestanding_optional
|
Machen Sie Teile von std::optional "freestanding" | 202311L
|
(C++26) | P2407R5 |
__cpp_lib_freestanding_ranges
|
Freestanding-Funktionen in <ranges> | 202306L
|
(C++26) | P2198R7 |
__cpp_lib_freestanding_ratio
|
Freestanding-Funktionen in <ratio> | 202306L
|
(C++26) | P2198R7 |
__cpp_lib_freestanding_string_view
|
Machen Sie Teile von std::string_view "freestanding" | 202311L
|
(C++26) | P2407R5 |
__cpp_lib_freestanding_tuple
|
Freestanding-Funktionen in <tuple> | 202306L
|
(C++26) | P2198R7 |
__cpp_lib_freestanding_utility
|
Freestanding-Funktionen in <utility> | 202306L
|
(C++26) | P2198R7 |
__cpp_lib_freestanding_variant
|
Machen Sie Teile von std::variant "freestanding" | 202311L
|
(C++26) | P2407R5 |
__cpp_lib_fstream_native_handle
|
Ermittlung nativer Handles von Dateiströmen | 202306L
|
(C++26) | P1759R6 |
__cpp_lib_function_ref
|
std::function_ref: Ein typ-erased callable Referenz | 202306L
|
(C++26) | P0792R14 |
__cpp_lib_gcd_lcm
|
std::gcd, std::lcm | 201606L
|
(C++17) | P0295R0 |
__cpp_lib_generator
|
std::generator: Synchroner Coroutine-Generator für Ranges | 202207L
|
(C++23) | P2502R2 |
__cpp_lib_generic_associative_lookup
|
Heterogene Vergleiche in assoziativen Containern | 201304L
|
(C++14) | N3657 |
__cpp_lib_generic_unordered_lookup
|
Heterogene Vergleiche in ungeordneten assoziativen Containern | 201811L
|
(C++20) | P0919R3 |
__cpp_lib_hardware_interference_size
|
Constexpr std::hardware_{constructive, destructive}_interference_size | 201703L
|
(C++17) | P0154R1 |
__cpp_lib_hive
|
<hive>: Ein bucket-basierter Container, der Speicherorte von gelöschten Elementen wiederverwendet | 202502L
|
(C++26) | P0447R28 |
__cpp_lib_has_unique_object_representations
|
std::has_unique_object_representations | 201606L
|
(C++17) | P0258R2 |
__cpp_lib_hazard_pointer
|
<hazard_pointer>: Hazard-Pointer | 202306L
|
(C++26) | P2530R3 |
__cpp_lib_hypot
|
3-Argument-Überladung von std::hypot | 201603L
|
(C++17) | P0030R1 |
__cpp_lib_incomplete_container_elements
|
Minimale Unterstützung für unvollständige Typen für std::forward_list, std::list und std::vector | 201505L
|
(C++17) | N4510 |
__cpp_lib_indirect
|
std::indirect | 202502L
|
(C++26) | P3019R13 |
__cpp_lib_inplace_vector
|
std::inplace_vector: Dynamisch größenveränderbarer Vektor mit fester Kapazität (Inplace-Speicherung) | 202406L
|
(C++26) | P0843R14 |
__cpp_lib_int_pow2
|
Ganzzahlige Potenz-von-2-Operationen (std::has_single_bit, std::bit_ceil, std::bit_floor, std::bit_width) | 202002L
|
(C++20) | P0556R3 P1956R1 |
__cpp_lib_integer_comparison_functions
|
Ganzzahl-Vergleichsfunktionen | 202002L
|
(C++20) | P0586R2 |
__cpp_lib_integer_sequence
|
Ganzzahlsequenzen zur Compilezeit | 201304L
|
(C++14) | N3658 |
__cpp_lib_integral_constant_callable
|
std::integral_constant::operator() | 201304L
|
(C++14) | N3545 |
__cpp_lib_interpolate
|
std::lerp, std::midpoint | 201902L
|
(C++20) | P0811R3 |
__cpp_lib_invoke
|
std::invoke | 201411L
|
(C++17) | N4169 |
__cpp_lib_invoke_r
|
std::invoke_r | 202106L
|
(C++23) | P2136R3 |
__cpp_lib_ios_noreplace
|
Unterstützung für exklusiven Modus für fstreams | 202207L
|
(C++23) | P2467R1 |
__cpp_lib_is_aggregate
|
std::is_aggregate | 201703L
|
(C++17) | LWG2911 |
__cpp_lib_is_constant_evaluated
|
std::is_constant_evaluated | 201811L
|
(C++20) | P0595R2 |
__cpp_lib_is_final
|
std::is_final | 201402L
|
(C++14) | LWG2112 |
__cpp_lib_is_implicit_lifetime
|
std::is_implicit_lifetime | 202302L
|
(C++23) | P2674R1 |
__cpp_lib_is_invocable
|
std::is_invocable, std::invoke_result | 201703L
|
(C++17) | P0604R0 |
__cpp_lib_is_layout_compatible
|
std::is_layout_compatible | 201907L
|
(C++20) | P0466R5 |
__cpp_lib_is_nothrow_convertible
|
std::is_convertible | 201806L
|
(C++20) | P0758R1 LWG3356 |
__cpp_lib_is_null_pointer
|
std::is_null_pointer | 201309L
|
(C++14) (DR11) |
LWG2247 |
__cpp_lib_is_pointer_interconvertible
|
Pointer-Interkonvertierbarkeits-Traits: std::is_pointer_interconvertible_with_class, std::is_pointer_interconvertible_base_of | 201907L
|
(C++20) | P0466R5 |
__cpp_lib_is_scoped_enum
|
std::is_scoped_enum | 202011L
|
(C++23) | P1048R1 |
__cpp_lib_is_sufficiently_aligned
|
std::is_sufficiently_aligned: Prüft die Alignment-Vorbedingung eines Zeigers | 202411L
|
(C++26) | P2897R7 |
__cpp_lib_is_swappable
|
(nothrow-)swappable Traits | 201603L
|
(C++17) | P0185R1 |
__cpp_lib_is_virtual_base_of
|
std::is_virtual_base_of: Type-Trait zur Erkennung virtueller Basisklassen | 202406L
|
(C++26) | P2985R0 |
__cpp_lib_is_within_lifetime
|
Prüfen, ob eine Union-Alternative aktiv ist (std::is_within_lifetime) | 202306L
|
(C++26) | P2641R4 |
__cpp_lib_jthread
|
Stop-Token und joining thread | 201911L
|
(C++20) | P0660R10 P1869R1 |
__cpp_lib_latch
|
std::latch | 201907L
|
(C++20) | P1135R6 |
__cpp_lib_launder
|
CWG issue 1776: Ersetzung von Klassenobjekten mit Referenzmitgliedern (std::launder) | 201606L
|
(C++17) | P0137R1 |
__cpp_lib_linalg
|
Eine freie Funktionsschnittstelle für lineare Algebra basierend auf BLAS | 202311L
|
(C++26) | P1673R13 |
__cpp_lib_list_remove_return_type
|
Ändern des Rückgabetyps von remove(), remove_if() und unique() von std::forward_list und std::list |
201806L
|
(C++20) | P0646R1 |
__cpp_lib_logical_traits
|
Logische Operationen auf Typ-Traits | 201510L
|
(C++17) | P0013R1 |
__cpp_lib_make_from_tuple
|
std::make_from_tuple | 201606L
|
(C++17) | P0209R2 |
__cpp_lib_make_reverse_iterator
|
std::make_reverse_iterator | 201402L
|
(C++14) | LWG2285 |
__cpp_lib_make_unique
|
std::make_unique | 201304L
|
(C++14) | N3656 |
__cpp_lib_map_try_emplace
|
std::map::try_emplace, std::map::insert_or_assign | 201411L
|
(C++17) | N4279 |
__cpp_lib_math_constants
|
Mathematische Konstanten | 201907L
|
(C++20) | P0631R8 |
__cpp_lib_math_special_functions
|
Mathematische Spezialfunktionen | 201603L
|
(C++17) | P0226R1 |
__cpp_lib_mdspan
|
std::mdspan | 202207L
|
(C++23) | P0009R18 P2599R2 P2604R0 P2613R1 |
| std::dims für std::mdspan | 202406L
|
(C++26) | P2389R2 | |
__cpp_lib_memory_resource
|
std::pmr::memory_resource | 201603L
|
(C++17) | P0220R1 |
__cpp_lib_modules
|
Standardbibliotheksmodule std und std.compat |
202207L
|
(C++23) | P2465R3 |
__cpp_lib_move_iterator_concept
|
Machen Sie std::move_iterator<T*> zu einem Random-Access-Iterator | 202207L
|
(C++23) | P2520R0 |
__cpp_lib_move_only_function
|
std::move_only_function | 202110L
|
(C++23) | P0288R9 |
__cpp_lib_node_extract
|
Splicing von Maps und Sets (std::map::extract, std::map::merge, insert(node_type), etc.) | 201606L
|
(C++17) | P0083R3 |
__cpp_lib_nonmember_container_access
|
std::size, std::data und std::empty | 201411L
|
(C++17) | N4280 |
__cpp_lib_not_fn
|
std::not_fn | 201603L
|
(C++17) | P0005R4 |
| Erlauben Sie die Übergabe von aufrufbaren Objekten als Nicht-Typ-Template-Argumente an std::not_fn | 202306L
|
(C++26) | P2714R1 | |
__cpp_lib_null_iterators
|
Null LegacyForwardIterator | 201304L
|
(C++14) | N3644 |
__cpp_lib_optional
|
std::optional | 201606L
|
(C++17) | P0220R1 P0032R3 P0307R2 |
| Vollständig constexpr std::optional | 202106L
|
(C++23) (DR20) |
P2231R1 | |
| Monadische Operationen in std::optional | 202110L
|
(C++23) | P0798R8 LWG3621 | |
__cpp_lib_optional_range_support
|
std::optional Range-Unterstützung | 202406L
|
(C++26) | P3168R2 |
__cpp_lib_out_ptr
|
std::out_ptr, std::inout_ptr | 202106L
|
(C++23) | P1132R8 |
| Freestanding std::out_ptr, std::inout_ptr | 202311L
|
(C++26) | P2833R2 | |
__cpp_lib_parallel_algorithm
|
Parallele Algorithmen | 201603L
|
(C++17) | P0024R2 |
__cpp_lib_polymorphic
|
std::polymorphic | 202502L
|
(C++26) | P3019R13 |
__cpp_lib_polymorphic_allocator
|
std::pmr::polymorphic_allocator<> als Vokabulartyp | 201902L
|
(C++20) | P0339R6 LWG3437 |
__cpp_lib_print
|
Formatierte Ausgabe | 202207L
|
(C++23) | P2093R14 |
| Erlauben einer effizienten Implementierung von std::print | 202403L
|
(C++26) (DR23) |
P3107R5 P3235R3 | |
| Drucken von Leerzeilen mit std::println | 202403L
|
(C++26) | P3142R0 | |
__cpp_lib_quoted_string_io
|
std::quoted | 201304L
|
(C++14) | N3654 |
__cpp_lib_philox_engine
|
std::philox_engine: Zählerbasierte Zufallszahl-Engine | 202406L
|
(C++26) | P2075R6 |
__cpp_lib_ranges
|
Ranges-Bibliothek und eingeschränkte Algorithmen | 201911L
|
(C++20) | P0896R4 P1035R7 P1716R3 |
| Nicht standardmäßig initialisierbare Views | 202106L
|
(C++23) (DR20) |
P2325R3 | |
| Views mit Besitz | 202110L
|
P2415R2 | ||
| std::ranges::range_adaptor_closure | 202202L
|
(C++23) | P2387R3 | |
| Lockerung von Range-Adaptoren, um move-only Typen zuzulassen | 202207L
|
P2494R2 | ||
| Entfernen von "poison pill"-Überladungen in ranges::begin, ranges::end, ranges::rbegin, ranges::rend und ranges::size | 202211L
|
P2602R2 | ||
| Lockerung von Ranges, um bestimmte Projektionen zuzulassen | 202302L
|
P2609R3 | ||
| Entfernen der gemeinsamen Referenzanforderung aus den indirekt aufrufbaren Konzepten | 202406L
|
(C++26) (DR20) |
P2997R1 | |
__cpp_lib_ranges_as_const
|
std::const_iterator, std::ranges::as_const_view | 202207L
|
(C++23) | P2278R4 |
| Machen Sie std::basic_const_iterator konvertierbar entsprechend seines zugrundeliegenden Typs | 202311L
|
(C++26) | P2836R1 | |
__cpp_lib_ranges_as_rvalue
|
std::ranges::as_rvalue_view | 202207L
|
(C++23) | P2446R2 |
__cpp_lib_ranges_cache_latest
|
std::ranges::cache_latest_view | 202411L
|
(C++26) | P3138R5 |
__cpp_lib_ranges_cartesian_product
|
std::ranges::cartesian_product_view | 202207L
|
(C++23) | P2374R4 P2540R1 |
__cpp_lib_ranges_chunk
|
std::ranges::chunk_view | 202202L
|
(C++23) | P2442R1 |
__cpp_lib_ranges_chunk_by
|
std::ranges::chunk_by_view | 202202L
|
(C++23) | P2443R1 |
__cpp_lib_ranges_concat
|
std::ranges::concat_view | 202403L
|
(C++26) | P2542R8 |
__cpp_lib_ranges_contains
|
std::ranges::contains | 202207L
|
(C++23) | P2302R4 |
__cpp_lib_ranges_enumerate
|
std::ranges::enumerate_view | 202302L
|
(C++23) | P2164R9 |
__cpp_lib_ranges_find_last
|
std::ranges::find_last, std::ranges::find_last_if und std::ranges::find_last_if_not | 202207L
|
(C++23) | P1223R5 LWG3807 |
__cpp_lib_ranges_fold
|
std::ranges Fold-Algorithmen |
202207L
|
(C++23) | P2322R6 |
__cpp_lib_ranges_generate_random
|
Vektor-API für Zufallszahlengenerierung (std::ranges::generate_random) | 202403L
|
(C++26) | P1068R11 |
__cpp_lib_ranges_iota
|
std::ranges::iota | 202202L
|
(C++23) | P2440R1 |
__cpp_lib_ranges_join_with
|
std::ranges::join_with_view | 202202L
|
(C++23) | P2441R2 |
__cpp_lib_ranges_repeat
|
std::ranges::repeat_view | 202207L
|
(C++23) | P2474R2 |
__cpp_lib_ranges_reserve_hint
|
std::ranges::approximately_sized_range und std::ranges::reserve_hint | 202502L
|
(C++26) | P2846R6 |
__cpp_lib_ranges_slide
|
std::ranges::slide_view | 202202L
|
(C++23) | P2442R1 |
__cpp_lib_ranges_starts_ends_with
|
std::ranges::starts_with, std::ranges::ends_with | 202106L
|
(C++23) | P1659R3 |
__cpp_lib_ranges_stride
|
std::ranges::stride_view | 202207L
|
(C++23) | P1899R3 |
__cpp_lib_ranges_to_container
|
std::ranges::to | 202202L
|
(C++23) | P1206R7 |
__cpp_lib_ranges_to_input
|
std::ranges::to_input_view | 202502L
|
(C++26) | P3137R3 |
__cpp_lib_ranges_zip
|
std::ranges::zip_view, std::ranges::zip_transform_view, std::ranges::adjacent_view, std::ranges::adjacent_transform_view | 202110L
|
(C++23) | P2321R2 |
__cpp_lib_ratio
|
Hinzufügen der neuen SI-Präfixe von 2022 | 202306L
|
(C++26) | P2734R0 |
__cpp_lib_raw_memory_algorithms
|
Erweiterung von Werkzeugen zur Speicherverwaltung | 201606L
|
(C++17) | P0040R3 |
| Constexpr für spezialisierte Speicher-Algorithmen | 202411L
|
(C++26) | P3508R0 P3369R0 | |
__cpp_lib_rcu
|
<rcu>: Read-Copy Update (RCU) | 202306L
|
(C++26) | P2545R4 |
__cpp_lib_reference_from_temporary
|
std::reference_constructs_from_temporary und std::reference_converts_from_temporary | 202202L
|
(C++23) | P2255R2 |
__cpp_lib_reference_wrapper
|
Vergleiche für std::reference_wrapper | 202403L
|
(C++26) | P2944R3 |
__cpp_lib_remove_cvref
|
std::remove_cvref | 201711L
|
(C++20) | P0550R2 |
__cpp_lib_result_of_sfinae
|
std::result_of und SFINAE | 201210L
|
(C++14) | N3462 |
__cpp_lib_robust_nonmodifying_seq_ops
|
Robustere nicht-modifizierende Sequenzoperationen (Zwei-Range-Überladungen für std::mismatch, std::equal und std::is_permutation) | 201304L
|
(C++14) | N3671 |
__cpp_lib_sample
|
std::sample | 201603L
|
(C++17) | P0220R1 |
__cpp_lib_saturation_arithmetic
|
Sättigungsarithmetik | 202311L
|
(C++26) | P0543R3 |
__cpp_lib_scoped_lock
|
std::scoped_lock | 201703L
|
(C++17) | P0156R2 |
__cpp_lib_semaphore
|
std::counting_semaphore, std::binary_semaphore |
201907L
|
(C++20) | P1135R6 |
__cpp_lib_senders
|
std::execution: Sender-Receiver-Modell der Ausführungskontrolle | 202406L
|
(C++26) | P2300R10 |
__cpp_lib_shared_mutex
|
std::shared_mutex (untimed) | 201505L
|
(C++17) | N4508 |
__cpp_lib_shared_ptr_arrays
|
std::shared_ptr<T[]> | 201611L
|
(C++17) | P0497R0 |
| Array-Unterstützung von std::make_shared | 201707L
|
(C++20) | P0674R1 | |
__cpp_lib_shared_ptr_weak_type
|
shared_ptr::weak_type | 201606L
|
(C++17) | P0163R0 |
__cpp_lib_shared_timed_mutex
|
std::shared_timed_mutex | 201402L
|
(C++14) | N3891 |
__cpp_lib_shift
|
std::shift_left und std::shift_right | 201806L
|
(C++20) | P0769R2 |
| std::ranges::shift_left und std::ranges::shift_right | 202202L
|
(C++23) | P2440R1 | |
__cpp_lib_simd
|
<simd>: Datenparallele Typen | 202411L
|
(C++26) | P1928R15 |
__cpp_lib_smart_ptr_for_overwrite
|
Erstellung von Smart Pointern mit Standardinitialisierung (std::allocate_shared_for_overwrite, std::make_shared_for_overwrite, std::make_unique_for_overwrite) | 202002L
|
(C++20) | P1020R1 P1973R1 |
__cpp_lib_smart_ptr_owner_equality
|
Ermöglicht die Verwendung von std::weak_ptr als Schlüssel in ungeordneten assoziativen Containern | 202306L
|
(C++26) | P1901R2 |
__cpp_lib_source_location
|
Erfassung von Quellcodeinformationen (std::source_location) | 201907L
|
(C++20) | P1208R6 |
__cpp_lib_span
|
std::span | 202002L
|
(C++20) | P0122R7 LWG3274 P1024R3 P1976R2 |
| Machen Sie Teile von std::span "freestanding" | 202311L
|
(C++26) | P2821R5 P2833R2 | |
__cpp_lib_span_initializer_list
|
Konstruktion von std::span aus einer Initialisierungsliste | 202311L
|
(C++26) | P2447R6 |
__cpp_lib_spanstream
|
std::spanbuf, std::spanstream | 202106L
|
(C++23) | P0448R4 |
__cpp_lib_ssize
|
std::ssize und unsigniertes std::span::size | 201902L
|
(C++20) | P1227R2 |
__cpp_lib_sstream_from_string_view
|
Schnittstellen von std::stringstream mit std::string_view | 202306L
|
(C++26) | P2495R3 |
__cpp_lib_stacktrace
|
Stacktrace-Bibliothek | 202011L
|
(C++23) | P0881R7 |
__cpp_lib_start_lifetime_as
|
Explizites Lebensdauer-Management (std::start_lifetime_as) | 202207L
|
(C++23) | P2590R2 |
__cpp_lib_starts_ends_with
|
String-Präfix- und Suffixprüfung (starts_with() und ends_with() für std::string und std::string_view) |
201711L
|
(C++20) | P0457R2 |
__cpp_lib_stdatomic_h
|
Kompatibilitätsheader für C-atomare Operationen | 202011L
|
(C++23) | P0943R6 |
__cpp_lib_string_contains
|
contains() für std::basic_string und std::basic_string_view |
202011L
|
(C++23) | P1679R3 |
__cpp_lib_string_resize_and_overwrite
|
std::basic_string::resize_and_overwrite | 202110L
|
(C++23) | P1072R10 |
__cpp_lib_string_udls
|
Benutzerdefinierte Literale für String-Typen | 201304L
|
(C++14) | N3642 |
__cpp_lib_string_view
|
std::string_view | 201606L
|
(C++17) | P0220R1 P0254R2 |
| ConstexprIterator | 201803L
|
(C++20) | P0858R0 LWG3257 | |
| Verkettung von std::string und std::string_view | 202403L
|
(C++26) | P2591R5 | |
__cpp_lib_submdspan
|
std::submdspan | 202306L
|
(C++26) | P2630R4 |
| Gepufferte mdspan-Layouts | 202403L
|
P2642R6 | ||
__cpp_lib_syncbuf
|
Synchronisierter gepufferter ostream (std::syncbuf, std::osyncstream) und Manipulatoren | 201803L
|
(C++20) | P0053R7 P0753R2 |
__cpp_lib_text_encoding
|
std::text_encoding | 202306L
|
(C++26) | P1885R12 |
__cpp_lib_three_way_comparison
|
Drei-Wege-Vergleich (Bibliotheksunterstützung); Hinzufügen des Drei-Wege-Vergleichs zur Bibliothek | 201907L
|
(C++20) | P0768R1 P1614R2 |
__cpp_lib_to_address
|
Dienstprogramm zur Konvertierung eines Zeigers in einen rohen Zeiger (std::to_address) | 201711L
|
(C++20) | P0653R2 |
__cpp_lib_to_array
|
std::to_array | 201907L
|
(C++20) | P0325R4 |
__cpp_lib_to_chars
|
Elementare String-Konvertierungen (std::to_chars, std::from_chars) | 201611L
|
(C++17) | P0067R5 P0682R1 LWG3137 |
| Testen des Erfolgs oder Misserfolgs von <charconv>-Funktionen | 202306L
|
(C++26) | P2497R0 | |
__cpp_lib_to_string
|
Neudefinition von std::to_string in Bezug auf std::format | 202306L
|
(C++26) | P2587R3 |
__cpp_lib_to_underlying
|
std::to_underlying | 202102L
|
(C++23) | P1682R3 |
__cpp_lib_transformation_trait_aliases
|
Alias-Templates für Transformations-Traits | 201304L
|
(C++14) | N3655 |
__cpp_lib_transparent_operators
|
Transparente Operator-Funktoren (std::less<> et al) | 201210L
|
(C++14) | N3421 |
| Transparente std::owner_less (std::owner_less<void>) | 201510L
|
(C++17) | P0074R0 | |
__cpp_lib_trivially_relocatable
|
Traits und Operationen für triviale Verlagerbarkeit | 202502L
|
(C++26) | P2786R13 |
__cpp_lib_tuple_element_t
|
std::tuple_element_t | 201402L
|
(C++14) | N3887 |
__cpp_lib_tuple_like
|
Kompatibilität zwischen std::tuple und tuple-ähnlichen Objekten (std::pair, std::array, std::subrange) | 202207L
|
(C++23) | P2165R4 |
| Hinzufügen des Tuple-Protokolls zu std::complex | 202311L
|
(C++26) | P2819R2 | |
__cpp_lib_tuples_by_type
|
Adressierung von Tupeln nach Typ | 201304L
|
(C++14) | N3670 |
__cpp_lib_type_identity
|
std::type_identity | 201806L
|
(C++20) | P0887R1 |
__cpp_lib_type_trait_variable_templates
|
Variablentemplates für Typ-Traits (std::is_void_v, etc.) | 201510L
|
(C++17) | P0006R0 |
__cpp_lib_uncaught_exceptions
|
std::uncaught_exceptions | 201411L
|
(C++17) | N4259 |
__cpp_lib_unordered_map_try_emplace
|
std::unordered_map::try_emplace, std::unordered_map::insert_or_assign | 201411L
|
(C++17) | N4279 |
__cpp_lib_unreachable
|
std::unreachable | 202202L
|
(C++23) | P0627R6 |
__cpp_lib_unwrap_ref
|
std::unwrap_ref_decay und std::unwrap_reference | 201811L
|
(C++20) | P0318R1 LWG3348 |
__cpp_lib_variant
|
std::variant: Eine typsichere Union für C++17 | 201606L
|
(C++17) | P0088R3 P0393R3 P0032R3 |
| std::visit für von std::variant abgeleitete Klassen | 202102L
|
(C++23) (DR17) |
P2162R2 | |
| Vollständig constexpr std::variant | 202106L
|
(C++23) (DR20) |
P2231R1 | |
| Mitglied visit | 202306L
|
(C++26) | P2637R3 | |
__cpp_lib_void_t
|
std::void_t | 201411L
|
(C++17) | N3911 |
| Gesamtzahl der Makros: 255 | ||||
[bearbeiten] Beispiel
[bearbeiten] Normale Verwendung
#ifdef __has_include // Check if __has_include is present # if __has_include(<optional>) // Check for a standard library # include <optional> # elif __has_include(<experimental/optional>) // Check for an experimental version # include <experimental/optional> # elif __has_include(<boost/optional.hpp>) // Try with an external library # include <boost/optional.hpp> # else // Not found at all # error "Missing <optional>" # endif #endif #ifdef __has_cpp_attribute // Check if __has_cpp_attribute is present # if __has_cpp_attribute(deprecated) // Check for an attribute # define DEPRECATED(msg) [[deprecated(msg)]] # endif #endif #ifndef DEPRECATED # define DEPRECATED(msg) #endif DEPRECATED("foo() has been deprecated") void foo(); #if __cpp_constexpr >= 201304 // Check for a specific version of a feature # define CONSTEXPR constexpr #else # define CONSTEXPR inline #endif CONSTEXPR int bar(unsigned i) { #if __cpp_binary_literals // Check for the presence of a feature unsigned mask1 = 0b11000000; unsigned mask2 = 0b00000111; #else unsigned mask1 = 0xC0; unsigned mask2 = 0x07; #endif if (i & mask1) return 1; if (i & mask2) return 2; return 0; } int main() {}
[bearbeiten] Compiler Features Dump
Das folgende (C++11-kompatible) Programm gibt C++-Compiler-Features und Attribute aus. Beachten Sie, dass die Verwendung von __has_cpp_attribute() nicht konform ist und von der gcc/clang-Implementierung abhängt.
static constexpr struct change_these_options_to_select_what_will_be_printed { constexpr static int longest_macro_name { 45 }; constexpr static bool titles = 1; constexpr static bool counters = 1; constexpr static bool attributes = 1; constexpr static bool standard_values = 1; constexpr static bool compiler_specific = 1; constexpr static bool core_features = 1; constexpr static bool lib_features = 1; constexpr static bool supported_features = 1; constexpr static bool unsupported_features = 1; constexpr static bool sort_by_date = 0; constexpr static bool separate_year_month = 1; constexpr static bool separated_revisions = 1; constexpr static bool latest_revisions = 1; constexpr static bool cxx98 = 0; constexpr static bool cxx11 = 1; constexpr static bool cxx14 = 1; constexpr static bool cxx17 = 1; constexpr static bool cxx20 = 1; constexpr static bool cxx23 = 1; constexpr static bool cxx26 = 1; constexpr static bool cxx29 = 0; } print; #if __cplusplus < 201100 # error "C++11 or better is required" #endif #include <algorithm> #include <cstdio> #include <cstring> #include <utility> #include <vector> #ifdef __has_include # if __has_include(<version>) # include <version> # endif #endif // Expect a string that starts with 6-decimal-digits or with '_' (if unsupported) #define COMPILER_VALUE_INT(n) #n [0] == '_' ? 0 : \ (#n[5] - '0') + (#n[4] - '0') * 10 + (#n[3] - '0') * 100 + \ (#n[2] - '0') * 1000 + (#n[1] - '0') * 10000 + (#n[0] - '0') * 100000 #define COMPILER_FEATURE_ENTRY(expect, name) { #name, COMPILER_VALUE_INT(name), expect }, #if defined(__has_cpp_attribute) && defined(__GNUG__) # define COMPILER_ATTRIBUTE(expect, name) { #name, __has_cpp_attribute(name), expect }, #else # define COMPILER_ATTRIBUTE(expect, name) { #name, COMPILER_VALUE_INT(name), expect }, #endif #define COMPILER_SPECIFIC_STRING(value) #value #define COMPILER_SPECIFIC_ENTRY(name) { #name, COMPILER_SPECIFIC_STRING(name) }, class CompilerFeature { char const* name_; long data_; long std_; public: constexpr CompilerFeature(char const* name, long data, long std) : name_(name), data_(data), std_(std) {} constexpr CompilerFeature(CompilerFeature const&) = default; CompilerFeature& operator=(CompilerFeature const&) = default; bool operator<(CompilerFeature const& rhs) const { return std::strcmp(name_, rhs.name_) < 0; } bool operator==(CompilerFeature const& rhs) const { return std::strcmp(name_, rhs.name_) == 0; } constexpr bool supported() const { return data_ >= std_; } constexpr bool maybe() const { return data_ > 0; } constexpr char const* name() const { return name_; } constexpr long std() const { return std_; } constexpr long data() const { return data_; } void data(long x) { data_ = x; } }; static /*constexpr*/ std::pair<const char*, const char*> compiler[] = { COMPILER_SPECIFIC_ENTRY(__cplusplus) //< not compiler specific, but useful :) COMPILER_SPECIFIC_ENTRY(__clang_major__) COMPILER_SPECIFIC_ENTRY(__clang_minor__) COMPILER_SPECIFIC_ENTRY(__clang_patchlevel__) COMPILER_SPECIFIC_ENTRY(__GNUG__) COMPILER_SPECIFIC_ENTRY(__GNUC_MINOR__) COMPILER_SPECIFIC_ENTRY(__GNUC_PATCHLEVEL__) // Add your favorite compiler specific macros. Undefined ones will not be printed. }; static constexpr CompilerFeature cxx98_core[] = { COMPILER_FEATURE_ENTRY(199711L, __cpp_exceptions) COMPILER_FEATURE_ENTRY(199711L, __cpp_rtti) }; static constexpr CompilerFeature cxx11_core[] = { COMPILER_FEATURE_ENTRY(200704L, __cpp_alias_templates) COMPILER_FEATURE_ENTRY(200809L, __cpp_attributes) COMPILER_FEATURE_ENTRY(200704L, __cpp_constexpr) COMPILER_FEATURE_ENTRY(201711L, __cpp_constexpr_in_decltype) COMPILER_FEATURE_ENTRY(200707L, __cpp_decltype) COMPILER_FEATURE_ENTRY(200604L, __cpp_delegating_constructors) COMPILER_FEATURE_ENTRY(201511L, __cpp_inheriting_constructors) COMPILER_FEATURE_ENTRY(200806L, __cpp_initializer_lists) COMPILER_FEATURE_ENTRY(200907L, __cpp_lambdas) COMPILER_FEATURE_ENTRY(200809L, __cpp_nsdmi) COMPILER_FEATURE_ENTRY(200907L, __cpp_range_based_for) COMPILER_FEATURE_ENTRY(200710L, __cpp_raw_strings) COMPILER_FEATURE_ENTRY(200710L, __cpp_ref_qualifiers) COMPILER_FEATURE_ENTRY(200610L, __cpp_rvalue_references) COMPILER_FEATURE_ENTRY(200410L, __cpp_static_assert) COMPILER_FEATURE_ENTRY(200806L, __cpp_threadsafe_static_init) COMPILER_FEATURE_ENTRY(200704L, __cpp_unicode_characters) COMPILER_FEATURE_ENTRY(200710L, __cpp_unicode_literals) COMPILER_FEATURE_ENTRY(200809L, __cpp_user_defined_literals) COMPILER_FEATURE_ENTRY(200704L, __cpp_variadic_templates) }; static constexpr CompilerFeature cxx14_core[] = { COMPILER_FEATURE_ENTRY(201304L, __cpp_aggregate_nsdmi) COMPILER_FEATURE_ENTRY(201304L, __cpp_binary_literals) COMPILER_FEATURE_ENTRY(201304L, __cpp_constexpr) COMPILER_FEATURE_ENTRY(201304L, __cpp_decltype_auto) COMPILER_FEATURE_ENTRY(201304L, __cpp_generic_lambdas) COMPILER_FEATURE_ENTRY(201304L, __cpp_init_captures) COMPILER_FEATURE_ENTRY(201304L, __cpp_return_type_deduction) COMPILER_FEATURE_ENTRY(201309L, __cpp_sized_deallocation) COMPILER_FEATURE_ENTRY(201304L, __cpp_variable_templates) }; static constexpr CompilerFeature cxx14_lib[] = { COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_chrono_udls) COMPILER_FEATURE_ENTRY(201309L, __cpp_lib_complex_udls) COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_exchange_function) COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_generic_associative_lookup) COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_integer_sequence) COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_integral_constant_callable) COMPILER_FEATURE_ENTRY(201402L, __cpp_lib_is_final) COMPILER_FEATURE_ENTRY(201309L, __cpp_lib_is_null_pointer) COMPILER_FEATURE_ENTRY(201402L, __cpp_lib_make_reverse_iterator) COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_make_unique) COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_null_iterators) COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_quoted_string_io) COMPILER_FEATURE_ENTRY(201210L, __cpp_lib_result_of_sfinae) COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_robust_nonmodifying_seq_ops) COMPILER_FEATURE_ENTRY(201402L, __cpp_lib_shared_timed_mutex) COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_string_udls) COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_transformation_trait_aliases) COMPILER_FEATURE_ENTRY(201210L, __cpp_lib_transparent_operators) COMPILER_FEATURE_ENTRY(201402L, __cpp_lib_tuple_element_t) COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_tuples_by_type) }; static constexpr CompilerFeature cxx17_core[] = { COMPILER_FEATURE_ENTRY(201603L, __cpp_aggregate_bases) COMPILER_FEATURE_ENTRY(201606L, __cpp_aligned_new) COMPILER_FEATURE_ENTRY(201603L, __cpp_capture_star_this) COMPILER_FEATURE_ENTRY(201603L, __cpp_constexpr) COMPILER_FEATURE_ENTRY(201703L, __cpp_deduction_guides) COMPILER_FEATURE_ENTRY(201411L, __cpp_enumerator_attributes) COMPILER_FEATURE_ENTRY(201603L, __cpp_fold_expressions) COMPILER_FEATURE_ENTRY(201606L, __cpp_guaranteed_copy_elision) COMPILER_FEATURE_ENTRY(201603L, __cpp_hex_float) COMPILER_FEATURE_ENTRY(201606L, __cpp_if_constexpr) COMPILER_FEATURE_ENTRY(201606L, __cpp_inline_variables) COMPILER_FEATURE_ENTRY(201411L, __cpp_namespace_attributes) COMPILER_FEATURE_ENTRY(201510L, __cpp_noexcept_function_type) COMPILER_FEATURE_ENTRY(201411L, __cpp_nontype_template_args) COMPILER_FEATURE_ENTRY(201606L, __cpp_nontype_template_parameter_auto) COMPILER_FEATURE_ENTRY(201603L, __cpp_range_based_for) COMPILER_FEATURE_ENTRY(201411L, __cpp_static_assert) COMPILER_FEATURE_ENTRY(201606L, __cpp_structured_bindings) COMPILER_FEATURE_ENTRY(201611L, __cpp_template_template_args) COMPILER_FEATURE_ENTRY(201611L, __cpp_variadic_using) }; static constexpr CompilerFeature cxx17_lib[] = { COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_addressof_constexpr) COMPILER_FEATURE_ENTRY(201411L, __cpp_lib_allocator_traits_is_always_equal) COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_any) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_apply) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_array_constexpr) COMPILER_FEATURE_ENTRY(201510L, __cpp_lib_as_const) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_atomic_is_always_lock_free) COMPILER_FEATURE_ENTRY(201505L, __cpp_lib_bool_constant) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_boyer_moore_searcher) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_byte) COMPILER_FEATURE_ENTRY(201611L, __cpp_lib_chrono) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_clamp) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_enable_shared_from_this) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_execution) COMPILER_FEATURE_ENTRY(201703L, __cpp_lib_filesystem) COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_gcd_lcm) COMPILER_FEATURE_ENTRY(201703L, __cpp_lib_hardware_interference_size) COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_has_unique_object_representations) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_hypot) COMPILER_FEATURE_ENTRY(201505L, __cpp_lib_incomplete_container_elements) COMPILER_FEATURE_ENTRY(201411L, __cpp_lib_invoke) COMPILER_FEATURE_ENTRY(201703L, __cpp_lib_is_aggregate) COMPILER_FEATURE_ENTRY(201703L, __cpp_lib_is_invocable) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_is_swappable) COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_launder) COMPILER_FEATURE_ENTRY(201510L, __cpp_lib_logical_traits) COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_make_from_tuple) COMPILER_FEATURE_ENTRY(201411L, __cpp_lib_map_try_emplace) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_math_special_functions) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_memory_resource) COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_node_extract) COMPILER_FEATURE_ENTRY(201411L, __cpp_lib_nonmember_container_access) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_not_fn) COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_optional) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_parallel_algorithm) COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_raw_memory_algorithms) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_sample) COMPILER_FEATURE_ENTRY(201703L, __cpp_lib_scoped_lock) COMPILER_FEATURE_ENTRY(201505L, __cpp_lib_shared_mutex) COMPILER_FEATURE_ENTRY(201611L, __cpp_lib_shared_ptr_arrays) COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_shared_ptr_weak_type) COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_string_view) COMPILER_FEATURE_ENTRY(201611L, __cpp_lib_to_chars) COMPILER_FEATURE_ENTRY(201510L, __cpp_lib_transparent_operators) COMPILER_FEATURE_ENTRY(201510L, __cpp_lib_type_trait_variable_templates) COMPILER_FEATURE_ENTRY(201411L, __cpp_lib_uncaught_exceptions) COMPILER_FEATURE_ENTRY(201411L, __cpp_lib_unordered_map_try_emplace) COMPILER_FEATURE_ENTRY(202102L, __cpp_lib_variant) COMPILER_FEATURE_ENTRY(201411L, __cpp_lib_void_t) }; static constexpr CompilerFeature cxx20_core[] = { COMPILER_FEATURE_ENTRY(201902L, __cpp_aggregate_paren_init) COMPILER_FEATURE_ENTRY(202207L, __cpp_char8_t) COMPILER_FEATURE_ENTRY(202002L, __cpp_concepts) COMPILER_FEATURE_ENTRY(201806L, __cpp_conditional_explicit) COMPILER_FEATURE_ENTRY(202211L, __cpp_consteval) COMPILER_FEATURE_ENTRY(202002L, __cpp_constexpr) COMPILER_FEATURE_ENTRY(201907L, __cpp_constexpr_dynamic_alloc) COMPILER_FEATURE_ENTRY(201907L, __cpp_constinit) COMPILER_FEATURE_ENTRY(201907L, __cpp_deduction_guides) COMPILER_FEATURE_ENTRY(201707L, __cpp_designated_initializers) COMPILER_FEATURE_ENTRY(201707L, __cpp_generic_lambdas) COMPILER_FEATURE_ENTRY(201902L, __cpp_impl_coroutine) COMPILER_FEATURE_ENTRY(201806L, __cpp_impl_destroying_delete) COMPILER_FEATURE_ENTRY(201907L, __cpp_impl_three_way_comparison) COMPILER_FEATURE_ENTRY(201803L, __cpp_init_captures) COMPILER_FEATURE_ENTRY(201907L, __cpp_modules) COMPILER_FEATURE_ENTRY(201911L, __cpp_nontype_template_args) COMPILER_FEATURE_ENTRY(201907L, __cpp_using_enum) }; static constexpr CompilerFeature cxx20_lib[] = { COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_array_constexpr) COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_assume_aligned) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_atomic_flag_test) COMPILER_FEATURE_ENTRY(201711L, __cpp_lib_atomic_float) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_atomic_lock_free_type_aliases) COMPILER_FEATURE_ENTRY(201806L, __cpp_lib_atomic_ref) COMPILER_FEATURE_ENTRY(201711L, __cpp_lib_atomic_shared_ptr) COMPILER_FEATURE_ENTRY(201911L, __cpp_lib_atomic_value_initialization) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_atomic_wait) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_barrier) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_bind_front) COMPILER_FEATURE_ENTRY(201806L, __cpp_lib_bit_cast) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_bitops) COMPILER_FEATURE_ENTRY(201902L, __cpp_lib_bounded_array_traits) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_char8_t) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_chrono) COMPILER_FEATURE_ENTRY(202002L, __cpp_lib_concepts) COMPILER_FEATURE_ENTRY(201806L, __cpp_lib_constexpr_algorithms) COMPILER_FEATURE_ENTRY(201711L, __cpp_lib_constexpr_complex) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_constexpr_dynamic_alloc) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_constexpr_functional) COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_constexpr_iterator) COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_constexpr_memory) COMPILER_FEATURE_ENTRY(201911L, __cpp_lib_constexpr_numeric) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_constexpr_string) COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_constexpr_string_view) COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_constexpr_tuple) COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_constexpr_utility) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_constexpr_vector) COMPILER_FEATURE_ENTRY(201902L, __cpp_lib_coroutine) COMPILER_FEATURE_ENTRY(201806L, __cpp_lib_destroying_delete) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_endian) COMPILER_FEATURE_ENTRY(202002L, __cpp_lib_erase_if) COMPILER_FEATURE_ENTRY(201902L, __cpp_lib_execution) COMPILER_FEATURE_ENTRY(202110L, __cpp_lib_format) COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_generic_unordered_lookup) COMPILER_FEATURE_ENTRY(202002L, __cpp_lib_int_pow2) COMPILER_FEATURE_ENTRY(202002L, __cpp_lib_integer_comparison_functions) COMPILER_FEATURE_ENTRY(201902L, __cpp_lib_interpolate) COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_is_constant_evaluated) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_is_layout_compatible) COMPILER_FEATURE_ENTRY(201806L, __cpp_lib_is_nothrow_convertible) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_is_pointer_interconvertible) COMPILER_FEATURE_ENTRY(201911L, __cpp_lib_jthread) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_latch) COMPILER_FEATURE_ENTRY(201806L, __cpp_lib_list_remove_return_type) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_math_constants) COMPILER_FEATURE_ENTRY(202106L, __cpp_lib_optional) COMPILER_FEATURE_ENTRY(201902L, __cpp_lib_polymorphic_allocator) COMPILER_FEATURE_ENTRY(202110L, __cpp_lib_ranges) COMPILER_FEATURE_ENTRY(201711L, __cpp_lib_remove_cvref) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_semaphore) COMPILER_FEATURE_ENTRY(201707L, __cpp_lib_shared_ptr_arrays) COMPILER_FEATURE_ENTRY(201806L, __cpp_lib_shift) COMPILER_FEATURE_ENTRY(202002L, __cpp_lib_smart_ptr_for_overwrite) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_source_location) COMPILER_FEATURE_ENTRY(202002L, __cpp_lib_span) COMPILER_FEATURE_ENTRY(201902L, __cpp_lib_ssize) COMPILER_FEATURE_ENTRY(201711L, __cpp_lib_starts_ends_with) COMPILER_FEATURE_ENTRY(201803L, __cpp_lib_string_view) COMPILER_FEATURE_ENTRY(201803L, __cpp_lib_syncbuf) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_three_way_comparison) COMPILER_FEATURE_ENTRY(201711L, __cpp_lib_to_address) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_to_array) COMPILER_FEATURE_ENTRY(201806L, __cpp_lib_type_identity) COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_unwrap_ref) COMPILER_FEATURE_ENTRY(202106L, __cpp_lib_variant) }; static constexpr CompilerFeature cxx23_core[] = { COMPILER_FEATURE_ENTRY(202110L, __cpp_auto_cast) COMPILER_FEATURE_ENTRY(202211L, __cpp_constexpr) COMPILER_FEATURE_ENTRY(202110L, __cpp_explicit_this_parameter) COMPILER_FEATURE_ENTRY(202106L, __cpp_if_consteval) COMPILER_FEATURE_ENTRY(202207L, __cpp_implicit_move) COMPILER_FEATURE_ENTRY(202211L, __cpp_multidimensional_subscript) COMPILER_FEATURE_ENTRY(202207L, __cpp_named_character_escapes) COMPILER_FEATURE_ENTRY(202211L, __cpp_range_based_for) COMPILER_FEATURE_ENTRY(202011L, __cpp_size_t_suffix) COMPILER_FEATURE_ENTRY(202207L, __cpp_static_call_operator) }; static constexpr CompilerFeature cxx23_lib[] = { COMPILER_FEATURE_ENTRY(202106L, __cpp_lib_adaptor_iterator_pair_constructor) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_algorithm_iterator_requirements) COMPILER_FEATURE_ENTRY(202302L, __cpp_lib_allocate_at_least) COMPILER_FEATURE_ENTRY(202110L, __cpp_lib_associative_heterogeneous_erasure) COMPILER_FEATURE_ENTRY(202302L, __cpp_lib_barrier) COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_bind_back) COMPILER_FEATURE_ENTRY(202110L, __cpp_lib_byteswap) COMPILER_FEATURE_ENTRY(202302L, __cpp_lib_common_reference) COMPILER_FEATURE_ENTRY(202302L, __cpp_lib_common_reference_wrapper) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_concepts) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_constexpr_bitset) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_constexpr_charconv) COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_constexpr_cmath) COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_constexpr_memory) COMPILER_FEATURE_ENTRY(202106L, __cpp_lib_constexpr_typeinfo) COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_containers_ranges) COMPILER_FEATURE_ENTRY(202211L, __cpp_lib_expected) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_flat_map) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_flat_set) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_format) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_format_ranges) COMPILER_FEATURE_ENTRY(202302L, __cpp_lib_formatters) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_forward_like) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_generator) COMPILER_FEATURE_ENTRY(202106L, __cpp_lib_invoke_r) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_ios_noreplace) COMPILER_FEATURE_ENTRY(202302L, __cpp_lib_is_implicit_lifetime) COMPILER_FEATURE_ENTRY(202011L, __cpp_lib_is_scoped_enum) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_mdspan) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_modules) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_move_iterator_concept) COMPILER_FEATURE_ENTRY(202110L, __cpp_lib_move_only_function) COMPILER_FEATURE_ENTRY(202110L, __cpp_lib_optional) COMPILER_FEATURE_ENTRY(202106L, __cpp_lib_out_ptr) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_print) COMPILER_FEATURE_ENTRY(202302L, __cpp_lib_ranges) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_ranges_as_const) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_ranges_as_rvalue) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_ranges_cartesian_product) COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_ranges_chunk) COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_ranges_chunk_by) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_ranges_contains) COMPILER_FEATURE_ENTRY(202302L, __cpp_lib_ranges_enumerate) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_ranges_find_last) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_ranges_fold) COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_ranges_iota) COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_ranges_join_with) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_ranges_repeat) COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_ranges_slide) COMPILER_FEATURE_ENTRY(202106L, __cpp_lib_ranges_starts_ends_with) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_ranges_stride) COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_ranges_to_container) COMPILER_FEATURE_ENTRY(202110L, __cpp_lib_ranges_zip) COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_reference_from_temporary) COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_shift) COMPILER_FEATURE_ENTRY(202106L, __cpp_lib_spanstream) COMPILER_FEATURE_ENTRY(202011L, __cpp_lib_stacktrace) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_start_lifetime_as) COMPILER_FEATURE_ENTRY(202011L, __cpp_lib_stdatomic_h) COMPILER_FEATURE_ENTRY(202011L, __cpp_lib_string_contains) COMPILER_FEATURE_ENTRY(202110L, __cpp_lib_string_resize_and_overwrite) COMPILER_FEATURE_ENTRY(202102L, __cpp_lib_to_underlying) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_tuple_like) COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_unreachable) }; static constexpr CompilerFeature cxx26_core[] = { //< Continue to Populate COMPILER_FEATURE_ENTRY(202406L, __cpp_constexpr) COMPILER_FEATURE_ENTRY(202411L, __cpp_constexpr_exceptions) COMPILER_FEATURE_ENTRY(202502L, __cpp_contracts) COMPILER_FEATURE_ENTRY(202403L, __cpp_deleted_function) COMPILER_FEATURE_ENTRY(202406L, __cpp_fold_expressions) COMPILER_FEATURE_ENTRY(202311L, __cpp_pack_indexing) COMPILER_FEATURE_ENTRY(202306L, __cpp_placeholder_variables) COMPILER_FEATURE_ENTRY(202502L, __cpp_pp_embed) COMPILER_FEATURE_ENTRY(202306L, __cpp_static_assert) COMPILER_FEATURE_ENTRY(202411L, __cpp_structured_bindings) COMPILER_FEATURE_ENTRY(202502L, __cpp_template_parameters) COMPILER_FEATURE_ENTRY(202502L, __cpp_trivial_relocatability) COMPILER_FEATURE_ENTRY(202502L, __cpp_trivial_union) COMPILER_FEATURE_ENTRY(202403L, __cpp_variadic_friend) }; static constexpr CompilerFeature cxx26_lib[] = { //< Continue to Populate COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_algorithm_default_value_type) COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_aligned_accessor) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_associative_heterogeneous_insertion) COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_atomic_min_max) COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_atomic_ref) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_bind_back) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_bind_front) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_bitset) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_chrono) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_constexpr_algorithms) COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_constexpr_atomic) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_constexpr_cmath) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_constexpr_complex) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_containers) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_exceptions) COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_constexpr_exceptions) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_inplace_vector) COMPILER_FEATURE_ENTRY(202406L, __cpp_lib_constexpr_new) COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_constrained_equality) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_contracts) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_copyable_function) COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_debugging) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_format) COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_format_path) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_format_uchar) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_freestanding_algorithm) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_freestanding_array) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_char_traits) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_charconv) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_cstdlib) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_freestanding_cstring) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_cwchar) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_errc) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_freestanding_expected) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_feature_test_macros) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_functional) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_iterator) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_freestanding_mdspan) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_memory) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_freestanding_numeric) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_operator_new) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_freestanding_optional) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_ranges) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_ratio) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_freestanding_string_view) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_tuple) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_utility) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_freestanding_variant) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_fstream_native_handle) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_function_ref) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_hazard_pointer) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hive) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_indirect) COMPILER_FEATURE_ENTRY(202406L, __cpp_lib_inplace_vector) COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_is_sufficiently_aligned) COMPILER_FEATURE_ENTRY(202406L, __cpp_lib_is_virtual_base_of) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_is_within_lifetime) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_linalg) COMPILER_FEATURE_ENTRY(202406L, __cpp_lib_mdspan) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_not_fn) COMPILER_FEATURE_ENTRY(202406L, __cpp_lib_optional_range_support) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_out_ptr) COMPILER_FEATURE_ENTRY(202406L, __cpp_lib_philox_engine) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_polymorphic) COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_print) COMPILER_FEATURE_ENTRY(202406L, __cpp_lib_ranges) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_ranges_as_const) COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_ranges_cache_latest) COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_ranges_concat) COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_ranges_generate_random) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_ranges_reserve_hint) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_ranges_to_input) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_ratio) COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_raw_memory_algorithms) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_rcu) COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_reference_wrapper) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_saturation_arithmetic) COMPILER_FEATURE_ENTRY(202406L, __cpp_lib_senders) COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_simd) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_smart_ptr_owner_equality) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_span) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_span_initializer_list) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_sstream_from_string_view) COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_string_view) COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_submdspan) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_text_encoding) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_to_chars) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_to_string) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_trivially_relocatable) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_tuple_like) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_variant) }; static constexpr CompilerFeature cxx29_core[] = { //< Continue to Populate COMPILER_FEATURE_ENTRY(202604L, __cpp_core_TODO) }; static constexpr CompilerFeature cxx29_lib[] = { //< Continue to Populate COMPILER_FEATURE_ENTRY(202604L, __cpp_lib_TODO) }; static constexpr CompilerFeature attributes[] = { COMPILER_ATTRIBUTE(202207L, assume) COMPILER_ATTRIBUTE(200809L, carries_dependency) COMPILER_ATTRIBUTE(201309L, deprecated) COMPILER_ATTRIBUTE(201603L, fallthrough) COMPILER_ATTRIBUTE(202403L, indeterminate) COMPILER_ATTRIBUTE(201803L, likely) COMPILER_ATTRIBUTE(201603L, maybe_unused) COMPILER_ATTRIBUTE(201803L, no_unique_address) COMPILER_ATTRIBUTE(201907L, nodiscard) COMPILER_ATTRIBUTE(200809L, noreturn) COMPILER_ATTRIBUTE(201803L, unlikely) }; inline void show_compiler_specific_info() { std::printf("Compiler specific macros:\n"); for (auto co : compiler) if (std::strcmp(co.first, co.second)) std::printf("%*s %s\n", -print.longest_macro_name, co.first, co.second); } inline void print_compiler_feature(const CompilerFeature& x) { if (not ((print.supported_features and x.maybe()) or (print.unsupported_features and not x.maybe()))) return; auto print_year_month = [](long n) { return std::printf("%ld%s%02ld", n / 100, print.separate_year_month ? "-" : "", n % 100); }; std::printf("%*s ", -print.longest_macro_name, x.name()); x.maybe() ? print_year_month(x.data()) : std::printf("------%s", print.separate_year_month ? "-" : ""); if (print.standard_values) std::printf(" %c ", (x.supported() ? (x.data() > x.std() ? '>' : '=') : '<')), print_year_month(x.std()); std::puts(""); } template<class Container> inline void show(char const* const title, Container const& co) { if (print.titles) { std::printf("%-s (", title); if (print.counters) { std::printf("%zd/", std::count_if(std::begin(co), std::end(co), [](CompilerFeature x) { return x.supported(); })); } std::printf("%td)\n", std::distance(std::begin(co), std::end(co))); } if (print.sort_by_date) { std::vector<CompilerFeature> v(std::begin(co), std::end(co)); std::stable_sort(v.begin(), v.end(), [](CompilerFeature const& lhs, CompilerFeature const& rhs) { return lhs.data() < rhs.data(); }); std::for_each(v.cbegin(), v.cend(), print_compiler_feature); } else std::for_each(std::begin(co), std::end(co), print_compiler_feature); std::puts(""); } inline void show_latest() { auto latest_rev = []() -> int { return print.cxx29 ? 29 : print.cxx26 ? 26 : print.cxx23 ? 23 : print.cxx20 ? 20 : print.cxx17 ? 17 : print.cxx14 ? 14 : print.cxx11 ? 11 : 98; }; std::vector<CompilerFeature> latest; auto add = [&latest](CompilerFeature x) { auto i = std::lower_bound(latest.begin(), latest.end(), x); if (i == latest.end() or not (*i == x)) latest.insert(i, x); else if (i->data() < x.data()) i->data(x.data()); }; char text[64]; latest.reserve(512); // max macros if (print.core_features) { // preserve reverse revision insertion order! if (print.cxx29) std::for_each(std::begin(cxx29_core), std::end(cxx29_core), add); if (print.cxx26) std::for_each(std::begin(cxx26_core), std::end(cxx26_core), add); if (print.cxx23) std::for_each(std::begin(cxx23_core), std::end(cxx23_core), add); if (print.cxx20) std::for_each(std::begin(cxx20_core), std::end(cxx20_core), add); if (print.cxx17) std::for_each(std::begin(cxx17_core), std::end(cxx17_core), add); if (print.cxx14) std::for_each(std::begin(cxx14_core), std::end(cxx14_core), add); if (print.cxx11) std::for_each(std::begin(cxx11_core), std::end(cxx11_core), add); if (print.cxx98) std::for_each(std::begin(cxx98_core), std::end(cxx98_core), add); std::snprintf(text, sizeof text, "ALL CORE MACROS UP TO C++%02i", latest_rev()); show(text, latest); } latest.clear(); if (print.lib_features) { // preserve reverse revision insertion order! if (print.cxx29) std::for_each(std::begin(cxx29_lib), std::end(cxx29_lib), add); if (print.cxx26) std::for_each(std::begin(cxx26_lib), std::end(cxx26_lib), add); if (print.cxx23) std::for_each(std::begin(cxx23_lib), std::end(cxx23_lib), add); if (print.cxx20) std::for_each(std::begin(cxx20_lib), std::end(cxx20_lib), add); if (print.cxx17) std::for_each(std::begin(cxx17_lib), std::end(cxx17_lib), add); if (print.cxx14) std::for_each(std::begin(cxx14_lib), std::end(cxx14_lib), add); std::snprintf(text, sizeof text, "ALL LIB MACROS UP TO C++%02i", latest_rev()); show(text, latest); } } int main() { if (print.separated_revisions) { if (print.cxx98 and print.core_features) show("C++98 CORE", cxx98_core); if (print.cxx11 and print.core_features) show("C++11 CORE", cxx11_core); if (print.cxx14 and print.core_features) show("C++14 CORE", cxx14_core); if (print.cxx14 and print.lib_features ) show("C++14 LIB" , cxx14_lib); if (print.cxx17 and print.core_features) show("C++17 CORE", cxx17_core); if (print.cxx17 and print.lib_features ) show("C++17 LIB" , cxx17_lib); if (print.cxx20 and print.core_features) show("C++20 CORE", cxx20_core); if (print.cxx20 and print.lib_features ) show("C++20 LIB" , cxx20_lib); if (print.cxx23 and print.core_features) show("C++23 CORE", cxx23_core); if (print.cxx23 and print.lib_features ) show("C++23 LIB" , cxx23_lib); if (print.cxx26 and print.core_features) show("C++26 CORE", cxx26_core); if (print.cxx26 and print.lib_features ) show("C++26 LIB" , cxx26_lib); if (print.cxx29 and print.core_features) show("C++29 CORE", cxx29_core); if (print.cxx29 and print.lib_features ) show("C++29 LIB" , cxx29_lib); } if (print.latest_revisions) show_latest(); if (print.attributes) show("ATTRIBUTES", attributes); if (print.compiler_specific) show_compiler_specific_info(); }
Mögliche Ausgabe
C++11 CORE (20/20) __cpp_alias_templates 2007-04 = 2007-04 __cpp_attributes 2008-09 = 2008-09 __cpp_constexpr 2022-11 > 2007-04 __cpp_constexpr_in_decltype 2017-11 = 2017-11 ... truncated ... C++14 CORE (9/9) __cpp_aggregate_nsdmi 2013-04 = 2013-04 __cpp_binary_literals 2013-04 = 2013-04 __cpp_constexpr 2022-11 > 2013-04 ... truncated ... C++14 LIB (20/20) __cpp_lib_chrono_udls 2013-04 = 2013-04 __cpp_lib_complex_udls 2013-09 = 2013-09 __cpp_lib_exchange_function 2013-04 = 2013-04 ... truncated ... ... truncated ... C++23 LIB (43/64) __cpp_lib_adaptor_iterator_pair_constructor 2021-06 = 2021-06 __cpp_lib_algorithm_iterator_requirements ------- < 2022-07 __cpp_lib_allocate_at_least ------- < 2023-02 __cpp_lib_associative_heterogeneous_erasure ------- < 2021-10 __cpp_lib_barrier 2019-07 < 2023-02 ... truncated ... ALL CORE MACROS UP TO C++26 (60/76) __cpp_aggregate_bases 2016-03 = 2016-03 __cpp_aggregate_nsdmi 2013-04 = 2013-04 __cpp_aggregate_paren_init 2019-02 = 2019-02 __cpp_alias_templates 2007-04 = 2007-04 ... truncated ... ALL LIB MACROS UP TO C++26 (158/255) __cpp_lib_adaptor_iterator_pair_constructor 2021-06 = 2021-06 __cpp_lib_addressof_constexpr 2016-03 = 2016-03 __cpp_lib_algorithm_iterator_requirements ------- < 2022-07 __cpp_lib_allocate_at_least ------- < 2023-02 __cpp_lib_allocator_traits_is_always_equal 2014-11 = 2014-11 ... truncated ... ATTRIBUTES (9/11) assume 2022-07 = 2022-07 carries_dependency ------- < 2008-09 deprecated 2013-09 = 2013-09 fallthrough 2016-03 = 2016-03 ... truncated ... Compiler specific macros: __cplusplus 202302L __GNUG__ 14 __GNUC_MINOR__ 2 __GNUC_PATCHLEVEL__ 0
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| P2552R3 | C++20 | __has_cpp_attribute muss für Standardattribute auf einen Wert größer als Null erweitert werden |
kann zu 0 erweitert werden |
[bearbeiten] Siehe auch
| Library Feature-Test Macros (C++20) | definiert im Header <version> |
| Vordefinierte Makrosymbole | |
| Makro-Symbol-Index | |
[bearbeiten] Externe Links
| 1. | Das offizielle Dokument zu Feature-Test-Empfehlungen |
| 2. | Quellcode zum Auslesen von Compiler-Features |