2015-03-25 11 views
8

Ich habe diese sehr einfache Funktion, die nicht kompilieren wird.conexpr Void-Funktion abgelehnt

constexpr void func() 
{ 
} 

Der Fehler Ich erhalte ist:

error: invalid return type 'void' of constexpr function 'constexpr void func()' 

    constexpr void func()

In C 14 ++ ist void ein wörtlicher Typ [§3.9/10]:

Ein Typ a wörtlicher Typ wenn es ist:

  • void; oder
  • ein skalarer Typ; oder
  • ein Referenztyp; oder
  • ein Array von Literaltyp; oder
  • ein Klassentyp (Ziffer 9), die alle der folgenden Eigenschaften hat:
    • es hat eine triviale destructor,
    • es ist ein Aggregat-Typ (8.5.1) oder mindestens ein constexpr Konstruktor oder Konstruktorvorlage, die kein Kopier- oder Verschiebekonstruktor ist, und
    • alle nicht statischen Datenelemente und Basisklassen sind nicht flüchtige Literaltypen.

Kann jemand erklären, warum diese ungültig ist?

+0

möglich Duplikat (http [Void als wörtliche Typ?]: // Stackoverflow .com/questions/27486581/void-as-a-literal-type) –

+0

Das Zitieren eines Arbeitsentwurfs nach C++ 14 ist nicht sehr nützlich, um Fakten zu C++ 14 nachzuweisen. –

Antwort

5

Der Vorschlag, der void einen literalen Typ machte, war n3652 Relaxing constraints on constexpr functions. G ++ entschieden, diese Funktion zu Version drücken 5 (I wurde mit 4.9.2):

G ++ unterstützt jetzt C++ 14 erweiterte constexpr.

constexpr int f (int i) 
{ 
    int j = 0; 
    for (; i > 0; --i) 
    ++j; 
    return j; 
} 

constexpr int i = f(42); // i is 42 

Clang hat sich diese seit der Version 3.4 implementiert hatte.

5

Es ist zwar gültig, aber noch nicht in GCC unterstützt. Ein Beispiel im Standard enthält tatsächlich constexpr Funktionen void Rückkehr - siehe [dcl.constexpr]/1:

constexpr void square(int &x); // OK: declaration 
// [..] 
constexpr void square(int &x) { // OK: definition 
    x *= x; 
} 

Example on Coliru mit Clang, die hier entspricht.

2

Entnommen Die C++ Einstellen Der Language (4. Auflage):

A constexpr Funktion nicht Nebenwirkungen haben können.

Also, was wäre der Zweck einer constexpr void-Funktion?

Wenn Sie wollen, so etwas zu tun:

constexpr void Twice(int &a) 
{ 
    a *= 2; 
} 

sollten Sie in Erwägung ziehen, zu:

constexpr int Twice(int a) 
{ 
    return 2 * a; 
} 
+4

Zweck? Einfach, z. B .: Vorlage consExpr void requireIntegral() {static_assert (std :: is_integral :: value, "Typ muss ganzzahlig sein"); }; –

+0

Sie haben Recht, guter Punkt. Nie gedacht, constexpr-Funktionen auf diese Weise zu verwenden. –