Heim > Artikel > Backend-Entwicklung > Warum kann ich Funktionsparameter nicht in konstanten Ausdrücken verwenden?
Konstante Ausdrücke sind Ausdrücke, die zur Kompilierungszeit ausgewertet werden können. Consexpr-Funktionen sind Funktionen, die zur Kompilierungszeit ausgewertet werden können, wenn sie mit constexpr-Parametern aufgerufen werden.
Im Code ist die make_const-Funktion eine constexpr-Funktion. Allerdings ist der Parameter i in t1 kein constexpr-Parameter, da er nicht als const angegeben ist.
void t1(const int i) { constexpr int ii = make_const(i); // error: i is not a constant expression }
Um dies zu beheben, kann man i entweder zu einem konstanten Parameter machen, indem man seinen Typ in const int ändert, oder indem Sie t1 selbst als constexpr-Funktion definieren:
void t1(const int i) // const int i to make i a constant parameter { constexpr int ii = make_const(i); }
constexpr int t1(const int i) // constexpr t1 to make t1 a constexpr function { return make_const(i); }
Ein weiteres Problem entsteht, wenn eine constexpr-Funktion innerhalb einer Vorlage verwendet wird Funktion, die einen constexpr-Wert zurückgeben soll.
template<int i> constexpr bool do_something(){ return i; } constexpr int t1(const int i) { return do_something<make_const(i)>(); // error: i is not a constant expression }
In diesem Fall kann der Compiler nicht garantieren, dass der Parameter i ein konstanter Ausdruck ist, da er vom Wert des an do_something übergebenen Vorlagenparameters abhängt. Um sicherzustellen, dass t1 zur Kompilierungszeit ausgewertet werden kann, muss der Vorlagenparameter i ein konstanter Ausdruck sein.
Ein alternativer Ansatz besteht darin, std::variant und std::integral_constant zu verwenden, um eine Konstante zur Kompilierungszeit zu erstellen kann in Verbindung mit Laufzeitwerten verwendet werden.
template<auto I> using constant_t=std::integral_constant<decltype(I),I>; template<auto I> constexpr constant_t<I> constant_v={}; template<auto...Is> using var_enum_t=std::variant<constant_t<Is>...>;
Dies ermöglicht die Erstellung einer Konstantenvariante zur Kompilierungszeit, die zur Laufzeit mit ausgewählt werden kann std::visit.
auto idx=var_index<5>(3/* 3 can be runtime */); std::visit([](auto three){ // three is a compile time value here }, idx);
Das obige ist der detaillierte Inhalt vonWarum kann ich Funktionsparameter nicht in konstanten Ausdrücken verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!