Ich habe diese sehr einfache Funktion, die nicht kompiliert wird.
%Vor%Der Fehler, den ich bekomme, ist:
%Vor% In% C ++ 14 ist void
ein Literaltyp [§3.9 / 10]:
Ein Typ ist ein literaler Typ , wenn er:
ist
- void; oder
- ein Skalartyp; oder
- ein Referenztyp; oder
- ein Array von literalem Typ; oder
- ein Klassentyp (Klausel 9) mit allen folgenden Eigenschaften:
- es hat einen trivialen Destruktor,
- es ist ein Aggregat-Typ (8.5.1) oder hat mindestens eine
constexpr
-Konstruktor- oder -Konstruktor-Vorlage, die kein Kopier- oder Bewegungs-Konstruktor ist, und- alle nicht statischen Datenelemente und Basisklassen sind nicht flüchtige Literaltypen.
Kann jemand erklären, warum das ungültig ist?
Der Vorschlag, der void
zu einem literalen Typ gemacht hat, war n3652 Entspannende Einschränkungen für constexpr
Funktionen G ++ entschied sich, dieses Feature auf die Version 5 zu übertragen (ich benutzte 4.9.2):
G ++ unterstützt jetzt C ++ 14 erweiterten consExpr.
%Vor%
Clang hat dies seit Version 3.4 implementiert.
Es ist zwar gültig, aber noch nicht in GCC unterstützt. Ein Beispiel im Standard enthält tatsächlich constexpr
Funktionen, die void
zurückgeben - siehe [dcl.contexpr] / 1:
Beispiel für Coliru mit Clang, das hier konform ist.
Entnommen aus Die C ++ Programmiersprache (4. Ausgabe) :
Eine constexpr-Funktion darf keine Nebenwirkungen haben.
Also, was wäre der Zweck einer constexpr void-Funktion?
Wenn Sie etwas so machen wollen:
%Vor%Sie sollten erwägen, zu:
zu wechseln %Vor%Tags und Links c++ language-lawyer c++14 constexpr return-type