Heim >Backend-Entwicklung >C++ >Warum kann ich keine Nicht-Constexpr-Argumente an eine Constexpr-Funktion übergeben?

Warum kann ich keine Nicht-Constexpr-Argumente an eine Constexpr-Funktion übergeben?

Susan Sarandon
Susan SarandonOriginal
2024-11-15 08:57:02616Durchsuche

Why Can't I Pass Non-Constexpr Arguments to a Constexpr Function?

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:

  • Eine constexpr-Variable ist eine Variable mit einem Wert, der garantiert zur Kompilierzeit verfügbar ist.
  • Eine constexpr-Funktion ist eine Funktion, die zur Kompilierzeit ausgewertet wird, wenn sie bereitgestellt wird constexpr-Argumente.

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!

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