Laut ist das Merkmal std::is_literal_type
in C++ 17 veraltet. Die Frage ist warum und was ist der bevorzugte Ersatz für die Zukunft zu prüfen, ob ein Typ ist ein literal type.Veraltet std :: is_literal_type in C++ 17
Antwort
Das
is_literal
Typ Merkmal bietet vernachlässigbaren Wert zu generischem Code, wie das, was wirklich benötigt wird, ist die Fähigkeit zu wissen, dass eine bestimmte Konstruktion konstante Initialisierung erzeugen würde. Der Kernbegriff eines Literaltyps mit mindestens einem consExpr-Konstruktor ist zu schwach, um sinnvoll verwendet zu werden.
Im Grunde, was es sagen will, ist, dass es kein Code ist man mit is_literal_type_v
schützen kann und dass ausreichend sein, um sicherzustellen, dass der Code tatsächlich constexpr ist. Das ist nicht gut genug:
template<typename T>
std::enable_if_t<std::is_literal_type_v<T>, void> SomeFunc()
{
constexpr T t{};
}
Es gibt keine Garantie, dass dies legal ist. Selbst wenn Sie es mit is_default_constructible<T>
bewachen, bedeutet das nicht, dass es consstexpr standardmäßig konstruierbar ist.
Was Sie benötigen, ist ein is_constexpr_constructible
Merkmal. Was noch nicht existiert.
Die (bereits implementierte) Eigenschaft schadet jedoch nicht und ermöglicht die Selbstüberprüfung während der Kompilierungszeit, für die Kerntyp-Kategorien einen gegebenen Template-Parameter erfüllen können. Bis die Kernarbeitsgruppe den Begriff eines literalen Typs in den Hintergrund rückt, sollte das entsprechende Bibliotheksmerkmal erhalten bleiben.
Der nächste Schritt zum Entfernen (nach der Veraltetheit) wäre, ein Papier zu schreiben, das vorschlägt, den Begriff aus der Kernsprache zu entfernen, während das Typmerkmal abgeschrieben/entfernt wird.
Also ist der Plan, schließlich die ganze Definition von "literalen Typen" loszuwerden, sie durch etwas feinkörnigeres zu ersetzen.
- 1. std :: map :: insert Änderung in C++ 17
- 2. C++ 17 std :: optional in G ++?
- 3. std :: in_place_t und Freunde in C++ 17
- 4. Warum hat std :: allocator Membertypen/Funktionen in C++ 17 verloren?
- 5. Warum ändert Operator() für Std :: Funktion in C++ 17?
- 6. std :: addressof als konstanter Ausdruck in C++ 17
- 7. Wie zu aktivieren/Std: C++ 17 in VS2017 mit CMake
- 8. Warum std :: function :: Argumenttyp ist veraltet?
- 9. C++ 17 Klassenvorlage Teilabzug
- 10. Von boost zu std :: experimental und weiterhin C++ 17
- 11. Wird der C++ 17-Standard "std :: byte" enthalten?
- 12. C++ 17 Ausdruck Auswertung Reihenfolge und Std :: move
- 13. C++ 17-fach Ausdruck in cout
- 14. Warum wurde std :: strstream veraltet?
- 15. C++ 17 make_optional conexpr-
- 16. Markenklasse/Methode in C++ veraltet oder veraltet
- 17. Compiler für C++ 17
- 18. C++ 17: integer_sequence Verwendung mit Kompilierungsfehler
- 19. C++ 17 Vektor von Generic (Polymorphic) lambdas
- 20. macOS Clang C++ 17-Dateisystem-Header nicht
- 21. C++ 17 strukturierte Bindungserklärung in für vs vs vs while?
- 22. Kompilieren Schub mit MSVC2015 mit/std: C++ neuesten (oder C++ 17/N4190)
- 23. Körper für reine virtuelle Funktion in C++ 17?
- 24. C++ 17 Variadic Template Folding
- 25. Funktionen drehen noexcept in C++ 17?
- 26. C++ 17-Variante <any> innerhalb der Klasse
- 27. Was ist das C++ 17-Äquivalent zu boost :: filesystem :: unique_path()?
- 28. Werden C++ 17 Vorlagenargumente mit Auto-Feature eingeschränkte std :: function-Objekte zulassen?
- 29. Warum erlaubt C++ 17's std :: any keinen Rückgabewert von any_cast?
- 30. Fehler: 'Vorlage <class> Klasse Std :: Auto_ptr' ist veraltet
Interessanterweise dachte ich, dass 'std :: is_literal_type' eine sichere Überprüfung bietet, ob ein Typ in constexpr-Ausdrücken verwendet werden kann oder nicht. Trotzdem ist das eine gute Antwort. – plasmacel