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!
[basic.types] / p10 gibt Folgendes an:
Ein Typ ist ein literaler Typ , wenn er:
ist
möglicherweise cv-qualifiziert
void
; oderein 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:
oder:
%Vor%Tags und Links c++ c++11 visual-c++ constexpr