Können Consteval-Funktionen Vorlagenparameter aktivieren, die auf Funktionsargumenten basieren?
In C 17 sind constexpr-Funktionen wie das folgende Snippet ungültig:
<code class="cpp">constexpr int foo(int i) { return std::integral_constant<int, i>::value; }</code>
Trotz der Auswertung von foo zur Kompilierungszeit erfordert der Compiler, dass es zur Laufzeit ausführbar ist, was die Instanziierung von Vorlagen behindert.
C 20 führt Consteval-Funktionen ein, die die Auswertung zur Kompilierzeit erzwingen. Man könnte sich fragen, ob dies Code wie den folgenden zulässt:
<code class="cpp">consteval int foo(int i) { return std::integral_constant<int, i>::value; }</code>
Die Antwort ist Nein.
Die möglichen Änderungen des Papiers können die singuläre Typisierung von Nicht-Vorlagen nicht ändern Funktionsdefinitionen. Wenn dieser Code außerdem gültig wäre, würde er die Möglichkeit eröffnen, Variablen vom Typ std::integral_constant
Das Papier veranschaulicht auch anhand eines Beispiels, dass Parameter nicht als zentrale konstante Ausdrücke behandelt werden:
<code class="cpp">consteval int sqrsqr(int n) { return sqr(sqr(n)); // Not a constant-expression at this point, but that's okay. }</code>
Im Wesentlichen wird Funktionsparametern aufgrund möglicher Typinkonsistenzen immer der Status eines konstanten Ausdrucks fehlen.
Das obige ist der detaillierte Inhalt vonKönnen Consteval-Funktionen Vorlagenparameter zulassen, die auf Funktionsargumenten basieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!