Literaltypklasse in C ++ 11 / C ++ 14

8
%Vor%

C ++ 11 Standard (ISO / IEC 14882: 2011), Abschnitt 3.9, Paragraph 10 (Hervorhebung von mir):

  

Ein Typ ist ein literaler Typ , wenn er:

ist      
  • ein Skalartyp; oder
  •   
  • ein Referenztyp; oder
  •   
  • ein Klassentyp (Klausel 9) mit allen folgenden Eigenschaften:      
    • es hat einen trivialen Destruktor,
    •   
    • Jeder Konstruktoraufruf und Vollausdruck in den brace-or-equal-initializern 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 eine Konstruktormaske, die kein Kopier- oder Bewegungskonstruktor ist, und
    •   
    • es enthält alle nicht statischen Datenelemente und Basisklassen von Literaltypen; oder
    •   
  •   
  • ein Array von Literaltyp.
  •   

Meiner Meinung nach ist class A unter Berücksichtigung der fett gedruckten Aufzählungszeichen in C ++ 11 kein Literaltyp, da es Konstruktoraufrufe und Klammer-oder-Gleichheitsinitialisierer für nicht statische Datenelemente gibt nicht konstante Ausdrücke. Ich habe versucht, constexpr vor der Konstruktordefinition zu setzen und auch den Konstruktoraufruf einer constexpr -Variable zuzuweisen, um zu überprüfen, dass sich der Compiler tatsächlich beschwert, weil das keine konstanten Ausdrücke sind. Sowohl Clang als auch GCC kompilieren es jedoch erfolgreich. Also ich liege wahrscheinlich falsch.

  • Weiß jemand, warum class A ein literaler Typ ist?

Die Fettschrift wurde in C ++ 14 ( N3652 ) entfernt, daher verstehe ich class A ist ein literaler Typ in C ++ 14. Ich muss wissen, denn function ist constexpr , daher each of its parameter types shall be a literal type (C ++ 11 / C ++ 14 Standard, Abschnitt 7.1.15, Absatz 3).

BEARBEITEN: In der Originalpost habe ich ein einfaches Beispiel verwendet, um es einfacher zu lesen, und erklärte, dass ich bereits viele Kombinationen ausprobiert habe. Jetzt habe ich das Beispiel mit einigen dieser Kombinationen aktualisiert, um zu zeigen, dass ich verschiedene Konstruktoraufrufe, Definitionen und nicht statische Datenelementinitialisierungen ausprobiert habe. Danke.

    
J L 02.02.2017, 13:33
quelle

1 Antwort

3
  

Weiß jemand, warum die Klasse A ein Literaltyp ist?

Es ist nicht in C ++ 11, aber es ist in C ++ 14, aus den Gründen, die du in deinem Post zitierst. Jedoch ...

  

Sowohl Clang als auch GCC kompilieren es jedoch erfolgreich. Da bin ich wahrscheinlich falsch.

Sie liegen nicht falsch. Weder sind clang und gcc. Der Code ist in der Tat gut gebildet, obwohl A kein literaler Typ ist ... einfach weil nichts erfordert, dass es ein literaler Typ ist. function kann eine constexpr -Funktion sein, wird aber nicht als konstanter Ausdruck aufgerufen. var ist kein constexpr -Objekt, daher gibt es keine erzwungene Anforderung, dass alle Objekte vom literalen Typ sind. Hattest du es versucht:

%Vor%

then Der Code wäre schlecht formatiert, da in diesem Fall function(...) ein zentraler Konstantenausdruck sein müsste, der literale Typen erfordert, was in C ++ erforderlich ist 11 A ist fehlgeschlagen. (Eigentlich hätten Sie auch das Problem in C ++ 14, dass keines der A s constexpr -Objekte ist).

    
Barry 13.03.2017, 14:11
quelle

Tags und Links