2016-02-29 18 views
8

Wenn ich eine constexpr Funktion definiere, sollte ich es auch als noexcept deklarieren? Ich stelle mir vor, dass in dem Fall, in dem die Argumente und die Verwendung die Anforderungen für die Kompilierzeitauswertung erfüllen, die Bedeutung möglicher Ausnahmen strittig ist. Für Fälle, in denen die Funktion zur Laufzeit ausgewertet wird, gilt dies jedoch als normal.Sollte "constexpr" auch "noexcept" sein?

Als eine Angelegenheit von praktischer Bedeutung, wenn die Funktion in der Tat einfache ist vielleicht integrierte sich mit der Arithmetik oder einer Besetzung, so dass ich der Compiler immer erwarten, dass die Funktion Inline können und über sie zu optimieren, zu macht es aus, die Effizienz des generierten Codes, wenn ich noexcept auslasse?

Antwort

7

Nein, sollten Sie nicht.

"Kann nicht fehlschlagen" und "kann zur Kompilierzeit ausgewertet werden" sind orthogonale Probleme. Beispielsweise möchten Sie eine ganzzahlige Potenzfunktion schreiben, aber Sie möchten die Leistung als signiert verwenden (weil Sie glauben, dass vorzeichenlose Zahlen nur für sehr spezielle Fälle verwendet werden sollten). Jetzt sagen Sie, dass Sie eine Ausnahme auslösen möchten, wenn die Macht negativ ist. In C++ 14 können Sie es wie folgt schreiben:

constexpr int ipow(int base, int power) { 
    if (power < 0) throw std::domain_error("negative power"); 
    int result = 1; 
    for (int i = 0; i < power; ++i) result *= base; 
    return result; 
} 

Diese Funktion eindeutig nicht noexcept ist, aber für nicht negative Argumente, können Sie offensichtlich bewerten es bei der Kompilierung. Wenn Sie es für negative Argumente in einem Kontext versuchen, in dem Sie das Ergebnis zur Kompilierungszeit benötigen, erhalten Sie einen Kompilierungsfehler, der in Ordnung sein sollte.