Heim  >  Artikel  >  Backend-Entwicklung  >  Können Consteval-Funktionen Vorlagenparameter zulassen, die auf Funktionsargumenten basieren?

Können Consteval-Funktionen Vorlagenparameter zulassen, die auf Funktionsargumenten basieren?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-24 01:35:01390Durchsuche

Can Consteval Functions Allow Template Parameters Reliant on Function Arguments?

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 zu deklarieren, was im Hinblick auf die One Definition Rule (ODR) äußerst restriktiv erscheint.

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!

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