2013-09-02 9 views
16

Das Buch, das ich lese, erwähnt häufig, dass ein Typ literal Typ sein muss, um in bestimmten Situationen zu verwenden, wie Typen, die constexpr verwenden können. Aber die einzige gegebene Definition war, dass literale Typen Arithmetik-, Referenz- oder Zeigertypen sind. Aber wenn wir einen consxpr-Typ definieren, scheint es, als müsste er mit einem Literal oder einer Variablen initialisiert werden, die ursprünglich mit einem Literal initialisiert wurde.Benötigen Sie eine Klarstellung zur Definition des Literaltyps

Ich bin verwirrt mit was qualifiziert sich als ein literaler Typ und was nicht.

Antwort

7

aus C++ 11, 3,9/10:

A-Typ ist ein Typ literal wenn er:

  • einen skalaren Typ; oder
  • ein Referenztyp; oder
  • ein Array von Literaltyp; oder
  • ein Klassentyp (Ziffer 9), die alle der folgenden Eigenschaften hat:
    • es hat eine triviale destructor,
    • jeden Konstruktoraufruf und Voll Expression in dem Klammer-oder-gleich-Initialisierer für nicht statische Datenelemente (falls vorhanden) ist ein konstanter Ausdruck (5.19),
    • Es ist ein Aggregat-Typ (8.5.1) oder hat mindestens einen consExpr-Konstruktor oder -Konstruktor-Vorlage, der kein Kopie- oder Verschiebekonstruktor ist. und
    • alle seine nicht statischen Datenelemente und Basisklassen sind von literalen Typen.

Also im Grunde ist es entweder eine Referenz oder ein primitiver Objekttyp, oder etwas, das sich aus einer wörtlichen Art in einer constexpr-Art und Weise konstruiert werden können (Arrays, Aggregate oder Klassen mit constexpr Konstrukteur).

+2

Was ist ein Beispiel für einen nicht literalen Typ? – Ares

+1

@Comrade: 'std :: string'. –

+0

Also meist nicht literale Typen sind Klassenarten, die die oben in der Antwort enthaltenen speziellen Klassenarten ausschließen. – Ares

2

C++ 11 (n3485), [basic.types] 9-10

Arithmetic Typen, Enumerationstypen, Zeigertypen, Zeiger auf Elementtypen, std::nullptr_t und cv qualifizierte Versionen dieser Typen werden zusammen skalare Typen genannt [...]

]

Ein Typ ist ein Typ literal wenn er:

  • einen skalaren Typ; oder
  • ein Referenztyp; oder
  • ein Array von Literaltyp; oder
  • ein Klassentyp, der alle der folgenden Eigenschaften hat:
    • es hat eine triviale destructor,
    • jeden Konstruktoraufruf und Voll Expression in den Klammer-oder-gleich-Initialisierer für nicht-statische Datenelemente (falls vorhanden) ist ein konstanter Ausdruck,
    • es ein Aggregat-Typ ist oder mindestens ein constexpr Konstruktor oder Konstruktor Vorlage, die keine Kopie oder verschieben Konstruktor ist, und
    • alle seiner nicht-statischen Datenelemente und Basisklassen sind nicht flüchtige Literaltypen.

[dcl.init.aggr]/1

Ein Aggregat ist ein Array oder eine Klasse ohne Benutzer bereitgestellten Konstruktoren, keine Klammer-oder-gleich -initialisers für nicht statische Datenelemente, keine privaten oder geschützten nicht statischen Datenelemente, keine Basisklassen und keine virtuellen Funktionen.

Verwandte Themen