2016-10-31 8 views

Antwort

13

As stated in P0174:

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.

+0

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

Verwandte Themen