
RetroX
Wie würde man richtig a static_assert
innerhalb eines constexpr
Funktion? Zum Beispiel:
constexpr int do_something(int x)
{
static_assert(x > 0, "x must be > 0");
return x + 5;
}
Dies ist kein gültiger C++11-Code, da eine constexpr-Funktion nur eine return-Anweisung enthalten darf. Ich glaube nicht, dass der Standard eine Ausnahme davon hat, obwohl der GCC 4.7 mich diesen Code nicht kompilieren lässt.

Johannes Schaub – litb
Dies ist kein gültiger C++11-Code, da eine constexpr-Funktion nur eine return-Anweisung enthalten darf.
Das ist falsch. static_assert
in einem constexpr
Funktion sind in Ordnung. Was ist nicht fine verwendet Funktionsparameter in konstanten Ausdrücken, so wie Sie es tun.
Sie könnten werfen, wenn x <= 0
. Das Aufrufen der Funktion in einem Kontext, der einen konstanten Ausdruck erfordert, wird dann nicht kompiliert
constexpr int do_something(int x) {
return x > 0 ? (x + 5) : (throw std::logic_error("x must be > 0"));
}

cppist
Dies funktioniert und ist gültiger C ++ 11-Code, da Vorlagenargumente nur zur Kompilierzeit gelten:
template <int x>
constexpr int do_something() {
static_assert(x > 0, "x must be > 0");
return x + 5;
}
Ich hatte die gleichen Probleme wie Sie mit konstanten Ausdrücken in C++. Derzeit gibt es nur wenige klare Dokumentationen zu constexprs. Und beachten Sie, dass es einige bekannte Fehler im Issue-Tracker von gcc gibt, aber Ihr Problem scheint kein Fehler zu sein.
Beachten Sie, dass Sie, wenn Sie constexpr-Funktionen innerhalb von Klassen deklarieren, diese nicht innerhalb der Klasse verwenden können. Auch das scheint kein Bug zu sein.
Bearbeiten: Dies ist laut Standard erlaubt: 7.1.3 heißt es
… oder eine zusammengesetzte Anweisung, die nur enthält
- Null-Anweisungen,
- static_assert-Erklärungen
- typedef-Deklarationen und Alias-Deklarationen, die dies nicht tun
Klassen oder Aufzählungen definieren,
- Verwendungserklärungen,
- using-Anweisungen,
- und genau eine return-Anweisung
9158600cookie-checkC++11 – static_assert innerhalb der constexpr-Funktion?yes