Heim  >  Artikel  >  Backend-Entwicklung  >  Warum funktioniert „if constexpr“ in nicht auf Vorlagen basierenden C-Funktionen nicht wie erwartet?

Warum funktioniert „if constexpr“ in nicht auf Vorlagen basierenden C-Funktionen nicht wie erwartet?

Susan Sarandon
Susan SarandonOriginal
2024-11-06 10:54:02498Durchsuche

Why Doesn't `if constexpr` Work as Expected in Non-Templated C   Functions?

if constexpr in C 17 funktioniert nicht in Funktionen ohne Vorlage

Einführung

Die Der C 17-Standard führte das if constexpr-Konstrukt ein, das eine bedingte Ausführung basierend auf konstanten Ausdrücken ermöglicht. Es wurde jedoch beobachtet, dass sich das Verhalten von constexpr unterscheidet, wenn es in vorlagenbasierten und nicht vorlagenbasierten Funktionen verwendet wird.

Problem

Betrachten Sie die folgende nicht vorlagenbasierte Funktion:

<code class="cpp">void print()
{
  auto value = 100;
  if constexpr (std::is_pointer_v<decltype(value)>){
    std::cout << "Ptr to " << *value << std::endl; // Error
  }
  else {
    std::cout << "Ref to " << value << std::endl;
  }
}</code>

Dieser Code führt zu einem Kompilierungsfehler, da *value für den abgeleiteten Typ int ungültig ist.

Antwort

Dieses Verhalten ist beabsichtigt. Wenn constexpr in Vorlagenfunktionen die Instanziierung von Zweigen vermeiden kann, die für bestimmte Vorlagenspezialisierungen nicht gültig sind. Bei Funktionen ohne Vorlage unterdrückt if constexpr jedoch nicht die Kompilierung des nicht genommenen Zweigs.

Beide Zweige der if constexpr-Anweisung werden analysiert und analysiert, auch wenn der nicht genommene Zweig ungültig ist. Daher versucht der Compiler im obigen Code, *value für einen int-Typ auszuwerten, was zu einem Fehler führt.

Schlussfolgerung

Diese Unterscheidung ist wichtig zu verstehen bei Verwendung von if constexpr. In Funktionen ohne Vorlage sollte es nur zur Überprüfung konstanter Ausdrücke verwendet werden, deren Gültigkeit für alle möglichen Werte der Eingabeparameter garantiert ist.

Das obige ist der detaillierte Inhalt vonWarum funktioniert „if constexpr“ in nicht auf Vorlagen basierenden C-Funktionen nicht wie erwartet?. 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