Heim > Backend-Entwicklung > C++ > Warum verursacht „if constexpr' Kompilierungsfehler in nicht auf Vorlagen basierenden Funktionen in C 17?

Warum verursacht „if constexpr' Kompilierungsfehler in nicht auf Vorlagen basierenden Funktionen in C 17?

Linda Hamilton
Freigeben: 2024-11-06 03:20:02
Original
881 Leute haben es durchsucht

Why Does

Fehler bei der Verwendung von „If constexpr“ in nicht auf Vorlagen basierenden Funktionen in C 17

In C 17 ermöglicht die „if constexpr“-Anweisung Folgendes Bedingtes Auswerten und Kompilieren von Code basierend auf konstanten Ausdrücken. Diese Funktion weist jedoch eine Einschränkung auf, wenn sie in nicht auf Vorlagen basierenden Funktionen verwendet wird.

Code:

<code class="cpp">#include <iostream>
#include <type_traits>

void print(auto value)
{
  if constexpr (std::is_pointer_v<decltype(value)>)
    std::cout << "Ptr to " << *value << std::endl;
  else
    std::cout << "Ref to " << value << std::endl;
}</code>
Nach dem Login kopieren

Problem:

Wenn „if constexpr“ wie oben gezeigt in einer Funktion ohne Vorlage verwendet wird, tritt beim Versuch, einen Nicht-Zeiger zu dereferenzieren, ein Kompilierungsfehler auf Wert. Dieser Fehler tritt auf, weil „if constexpr“ in Funktionen ohne Vorlagen im Gegensatz zu Funktionen mit Vorlagen nicht die Kompilierung von Codepfaden verhindert, die nicht verwendet werden.

Erklärung:

In Vorlagenfunktionen ermöglicht „if constexpr“ die bedingte Kompilierung von Code basierend auf dem Wert der Vorlagenparameter. In diesem Fall kann der Compiler zum Zeitpunkt der Kompilierung feststellen, ob die Vorlage für eine bestimmte Spezialisierung gültig ist, und nur den erforderlichen Codepfad instanziieren.

In Funktionen ohne Vorlage fungiert „if constexpr“ jedoch nur als bedingte Anweisung zur Laufzeit. Der Compiler analysiert weiterhin beide Zweige der bedingten Anweisung, und wenn Code im nicht verwendeten Zweig ungültig ist, tritt ein Kompilierungsfehler auf.

Lösung:

Um diesen Fehler zu vermeiden, verwenden Sie „if constexpr“ nur in Funktionen mit Vorlagen oder in Funktionen ohne Vorlagen, bei denen der Typ zur Kompilierungszeit bekannt ist und garantiert für beide Zweige der Bedingung gültig ist Aussage.

Das obige ist der detaillierte Inhalt vonWarum verursacht „if constexpr' Kompilierungsfehler in nicht auf Vorlagen basierenden Funktionen in C 17?. 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