Heim  >  Artikel  >  Backend-Entwicklung  >  Warum kann ich Funktionsparameter nicht in konstanten Ausdrücken verwenden?

Warum kann ich Funktionsparameter nicht in konstanten Ausdrücken verwenden?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-15 08:26:021002Durchsuche

Why Can't I Use Function Parameters in Constant Expressions?

Warum kann ich keine Funktionsparameter 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn