constexpr Leere Funktion abgelehnt

8

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?

    
user4713075 25.03.2015, 16:31
quelle

3 Antworten

5

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.

    
user4713075 25.03.2015 16:38
quelle
5

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:

%Vor%

Beispiel für Coliru mit Clang, das hier konform ist.

    
Columbo 25.03.2015 16:38
quelle
2

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%     
static_cats 25.03.2015 17:21
quelle