Warum beklagt sich der Compiler darüber, dass es sich nicht um einen Constexpr handelt?

8

Ich versuche, ein wenig mehr darüber zu lernen, wie man in der Praxis konstante C ++ - Ausdrücke benutzt, und habe zu Illustrationszwecken die folgende Matrix-Klassenvorlage erstellt:

%Vor%

Die Idee ist, eine einfache Matrix-Klasse zu haben, die ich für kleine Matrizen verwenden kann, um Matrix-Ausdrücke zur Kompilierzeit auszuwerten (beachte, dass ich die üblichen Matrix-Operatoren für Addition und Multiplikation noch nicht implementiert habe).

Wenn ich versuche, eine Matrix-Instanz wie folgt zu initialisieren:

%Vor%

Ich erhalte den folgenden Fehler vom Compiler (MS Visual C ++ 14):

%Vor%

Merken Sie, was ich falsch mache ... irgendeine Hilfe, zum dieser Arbeit zu machen würde sehr geschätzt werden!

    
BigONotation 29.06.2016, 15:10
quelle

1 Antwort

13

[basic.types] / p10 gibt Folgendes an:

  

Ein Typ ist ein literaler Typ , wenn er:

ist      
  • möglicherweise cv-qualifiziert void ; oder

  •   
  • ein Skalartyp; oder

  •   
  • ein Referenztyp; oder

  •   
  • ein Array von literalem Typ; oder

  •   
  • ein möglicherweise cv-qualifizierter Klassentyp (Klausel [Klasse] ) mit allen folgenden Eigenschaften:

         
    • es hat einen trivialen Destruktor,

    •   
    • es ist entweder ein Verschlusstyp ( [expr.prim.lambda] ) , ein Aggregat-Typ ( [dcl.init.aggr] ), oder hat mindestens einen consExpr-Konstruktor oder Konstruktorvorlage (möglicherweise geerbt ( [namespace.udecl] ) von einer Basisklasse), die keine Kopie ist oder Konstruktor verschieben,

    •   
    • Wenn es sich um eine Union handelt, ist mindestens eines seiner nicht statischen Datenelemente nicht flüchtiger Literaltyp und

    •   
    • Wenn es sich nicht um eine Union handelt, haben alle nicht statischen Datenelemente und Basisklassen nichtflüchtige Literaltypen.

    •   
  •   

[class.dtor] / p5 sagt Folgendes:

  

Ein Destruktor ist trivial, wenn er nicht vom Benutzer bereitgestellt wird und wenn:

     

(5.4) - der Destruktor ist nicht virtual ,

     

(5.5) - alle direkten Basisklassen seiner Klasse haben triviale Destruktoren und

     

(5.6) - für alle nicht statischen Datenmitglieder ihrer Klasse, die vom Klassentyp (oder Array davon) sind, jeder wie z   Klasse hat einen trivialen Destruktor.

     

Andernfalls ist der Destruktor nicht-trivial .

Mit anderen Worten, um eine constexpr Instanz von Matrix zu deklarieren, muss es ein Literaltyp sein, und sein Destruktor muss entweder default ed oder vollständig entfernt sein, also:

%Vor%

oder:

%Vor%     
Piotr Skotnicki 29.06.2016, 15:38
quelle

Tags und Links