Heim >Backend-Entwicklung >C++ >Warum kann ich keine Nicht-Constexpr-Argumente an eine Constexpr-Funktion übergeben?
Einschränkungen von Constexpr-Funktionsparametern in konstanten Ausdrücken
Beachten Sie den Codeausschnitt:
static constexpr int make_const(const int i){ return i; } void t1(const int i) { constexpr int ii = make_const(i); // error occurs here (i is not a constant expression) std::cout<<ii; }
Fehler Details
Der Code löst einen Fehler aus, wenn versucht wird, ii mit make_const(i) zu initialisieren, da i kein konstanter Ausdruck ist. Das liegt daran:
Die Übergabe eines Nicht-constexpr-Parameters an eine constexpr-Funktion führt nicht zu einer constexpr-Ausgabe. Die constexpr-Funktion kann jedoch die Konstituenz ihrer Eingabeparameter erben und weitergeben.
Zulässige Szenarien
Der folgende Code funktioniert, weil sowohl t1() als auch make_const() dies tun constexpr-Funktionen mit constexpr-Parametern:
constexpr int t1(const int i) { return make_const(i); }
Einschränkungen
Der folgende Code schlägt fehl, weil do_something() keine constexpr-Funktion ist, obwohl make_const() ist:
template<int i> constexpr bool do_something(){ return i; } constexpr int t1(const int i) { return do_something<make_const(i)>(); // error occurs here (i is not a constant expression) }
Fazit
Um solche Fehler zu vermeiden, ist es entscheidend, den Unterschied zwischen constexpr-Funktionen und -Variablen zu verstehen. Consexpr-Funktionen bieten die Flexibilität, sowohl zur Kompilierungszeit als auch zur Laufzeit ausgewertet zu werden, jedoch nur mit constexpr-Argumenten.
Das obige ist der detaillierte Inhalt vonWarum kann ich keine Nicht-Constexpr-Argumente an eine Constexpr-Funktion übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!