Heim >Backend-Entwicklung >C++ >Warum verursacht „if constexpr' Fehler in Funktionen ohne Vorlage in C 17?

Warum verursacht „if constexpr' Fehler in Funktionen ohne Vorlage in C 17?

Barbara Streisand
Barbara StreisandOriginal
2024-11-06 03:58:02861Durchsuche

Why does

Fehler „If constexpr“ in nicht auf Vorlagen basierenden Funktionen in C 17

Einführung

C 17 führte den if constexpr ein Schlüsselwort, das eine bedingte Kompilierung basierend auf Konstanten zur Kompilierungszeit ermöglicht. Bei der Verwendung von if constexpr in Funktionen ohne Vorlage können jedoch unerwartete Fehler auftreten. In diesem Artikel werden diese Probleme untersucht und eine Lösung bereitgestellt.

Codebeispiel

Betrachten Sie den folgenden Code:

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

int main() {
  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;
}

Kompilierungsfehler

Dieser Code generiert einen Kompilierungsfehler, wenn sich die if constexpr-Anweisung innerhalb der Hauptanweisung befindet Funktion:

main.cpp:8:32: error: invalid type argument of unary ‘*’ (have ‘int’)
std::cout << "Ptr to " << *value << std::endl;

Erklärung

Wenn constexpr nur in Vorlagenfunktionen funktioniert, weil es dem Compiler ermöglicht, die Instanziierung von Zweigen zu vermeiden, die zur Kompilierungszeit nicht genommen werden. Diese Optimierung ist für eine effiziente Template-Metaprogrammierung unerlässlich.

In Funktionen ohne Templates wertet constexpr weiterhin beide Zweige aus, auch wenn der Typ durch decltype abgeleitet wird. Dies bedeutet, dass der Fehler im obigen Code durch den Versuch verursacht wird, einen int-Wert im if-Zweig zu dereferenzieren.

Lösung

Um dieses Problem zu beheben, können Sie Folgendes tun Verschieben Sie die if constexpr-Anweisung in eine Vorlagenfunktion. Zum Beispiel:

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

int main() {
  auto value = 100;
  print(value);
}</code>

Dieser geänderte Code kompiliert und druckt die erwartete Ausgabe:

Ref to 100

Das obige ist der detaillierte Inhalt vonWarum verursacht „if constexpr' Fehler in Funktionen ohne Vorlage in C 17?. 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