Können Consteval-Funktionen Vorlagenparameter aktivieren, die von Funktionsargumenten abhängig sind?
Definieren Sie in C 17 eine constexpr-Funktion, die eine Konstante zur Kompilierungszeit zurückgibt mag logisch erscheinen, ist aber verboten. Der Compiler fordert Ausführungsanweisungen zur Laufzeit und verhindert so die Instanziierung von Vorlagen mit solchen Funktionen.
C 20 führt Konstruktionsfunktionen ein und stellt deren Auswertung zur Kompilierungszeit sicher. Damit erwarteten viele, dass diese Einschränkung verschwinden würde und Code wie folgt möglich wäre:
<code class="cpp">consteval int foo(int i) { return std::integral_constant<int, i>::value; }</code>
Die Antwort ist jedoch immer noch ein klares Nein.
Trotz der möglichen Änderungen des Papiers , bleibt die Tatsache bestehen, dass Nicht-Template-Funktionsdefinitionen nur einmal typisiert werden. Das Zulassen eines solchen Codes würde möglicherweise die Deklaration von Variablen mit nicht ODR-freundlichen Typen wie std::integral_constant
Das Papier impliziert auch, dass Parameter nicht behandelt werden sollten als zentrale konstante Ausdrücke. Ein Beispiel veranschaulicht dies:
<code class="cpp">consteval int sqrsqr(int n) { return sqr(sqr(n)); // Not a constant-expression at this point, } // but that's okay.</code>
Zusammenfassend lässt sich sagen, dass sich Funktionsparameter aufgrund möglicher Typinkonsistenzen nicht zu konstanten Ausdrücken entwickeln.
Das obige ist der detaillierte Inhalt vonKönnen Funktionsparameter aufgrund von Consteval-Funktionen vorlagenabhängig sein?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!