Heim > Backend-Entwicklung > C++ > Warum kann ich einen Funktionsparameter einer „constexpr'-Funktion nicht in einem konstanten Ausdruck verwenden?

Warum kann ich einen Funktionsparameter einer „constexpr'-Funktion nicht in einem konstanten Ausdruck verwenden?

Mary-Kate Olsen
Freigeben: 2024-11-14 15:06:02
Original
1058 Leute haben es durchsucht

Why Can't I Use a Function Parameter of a `constexpr` Function in a Constant Expression?

Funktionsparameter einer constexpr-Funktion kann nicht in einem konstanten Ausdruck verwendet werden

Problemeinführung und Codebeispiel

Der bereitgestellte Code zeigt einen Versuch dazu Verwenden Sie den Rückgabewert einer constexpr-Funktion make_const in einem konstanten Ausdruck, stößt jedoch auf einen Fehler.

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;
}

int main() {
   t1(12); // Call the function
}
Nach dem Login kopieren

Erklärung und Ansatz

Eine constexpr-Funktion führt entgegen der landläufigen Meinung nicht dazu, dass ihre Parameter zur Kompilierungszeit auf magische Weise ausgewertet werden. Stattdessen ermöglicht es die Weitergabe der Konstituenz von seinen Eingabeargumenten an seine Ausgabe. Im angegebenen Code ist der Funktionsparameter i jedoch kein constexpr, sodass die constexpr-Funktion make_const ihn nicht in einen solchen umwandeln kann.

Der Fehler entsteht, weil die nachfolgende Zuweisung constexpr int ii = make_const(i) versucht, dies zu tun Deklarieren Sie eine constexpr-Variable (ii), die mit dem Ergebnis eines Nicht-constexpr-Ausdrucks (make_const(i)) initialisiert wird. Dies ist nicht zulässig, da constexpr-Variablen immer mit constexpr-Ausdrücken initialisiert werden müssen.

constexpr-Funktionen verstehen

Eine constexpr-Funktion weist zwei Hauptmerkmale auf:

  • Dokumentation: Zeigt dem Compiler an, dass die Funktion ausgeführt wird, wenn constexpr-Argumente angegeben werden und die Ausführung ohne undefiniertes Verhalten kann zur Kompilierungszeit ausgewertet werden.
  • Anweisung: Sie fordert den Compiler auf, die Funktion zur Kompilierungszeit auszuwerten, wenn sie in bestimmten Kontexten verwendet wird, die constexpr-Ausdrücke erfordern.

Lösung

Um den Fehler zu beheben, kann man sicherstellen, dass der Funktionsparameter selbst vorhanden ist constexpr. Dies kann erreicht werden, indem die Funktionsdeklaration wie folgt geändert wird:

constexpr int make_const(constexpr int i) {
    return i;
}
Nach dem Login kopieren

Diese Änderung garantiert, dass die Funktion ihre constexpr-Eingaben effektiv in constexpr-Ausgaben umwandeln kann, wodurch die beabsichtigte Verwendung der Funktion innerhalb eines konstanten Ausdrucks ermöglicht wird.

In den bereitgestellten alternativen Codebeispielen kann die Funktion make_const als constexpr-Ausdruck in t1 aufgerufen werden, da ihre Parameter jetzt constexpr sind. Der Versuch, das Ergebnis eines Nicht-Constexpr-Ausdrucks (z. B. einer Laufzeitvariablen) an die Funktion zu übergeben, führt jedoch immer noch zu einem Fehler, da die Funktion für ihre Constexpr-Ausführung Constexpr-Argumente benötigt.

Das obige ist der detaillierte Inhalt vonWarum kann ich einen Funktionsparameter einer „constexpr'-Funktion nicht in einem konstanten Ausdruck verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage