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

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

Barbara Streisand
Barbara StreisandOriginal
2024-11-06 19:01:03578Durchsuche

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

if constexpr verhält sich in nicht auf Vorlagen basierenden Funktionen in C 17 nicht wie erwartet

In C 17 ermöglicht die if constexpr-Anweisung eine Bedingung Kompilierung basierend auf konstanten Ausdrücken zur Kompilierungszeit. Wenn Sie jedoch versuchen, diese Funktion in einer Funktion ohne Vorlage zu verwenden, können unerwartete Kompilierungsfehler auftreten.

Beachten Sie den folgenden Codeausschnitt:

<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;
}</code>

Beim Kompilieren dieses Codes tritt ein Fehler auf treten in der Zeile auf und versuchen, „value“ innerhalb der if constexpr-Anweisung zu dereferenzieren. Dies liegt daran, dass constexpr in Funktionen ohne Vorlagen nicht unterstützt wird.

Warum nur Vorlagen?

Dieses Verhalten ist beabsichtigt. wenn constexpr die Instanziierung von ungültigem Vorlagencode basierend auf bestimmten Spezialisierungen verhindern soll. Im bereitgestellten Beispiel prüft die Funktion ohne Vorlage mithilfe von std::is_pointer_v, ob „value“ ein Zeiger ist. Wenn die Bedingung jedoch falsch ist, versucht der Compiler immer noch, den ganzzahligen „Wert“ zu dereferenzieren, der ungültig ist.

Lösung

Zu verwenden if constexpr in nicht- Bei Kontexten mit Vorlagen sollten Sie erwägen, den Code in eine Vorlagenfunktion einzuschließen oder ein Makro zu verwenden, das sich zur Kompilierzeit anders verhält. Zum Beispiel:

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

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

int main()
{
  auto n = 1000;
  print(n);

  int *ptr = &n;
  print(ptr);
}</code>

In diesem Fall ist die Druckfunktion eine Vorlage, d. h. wenn das constexpr-Verhalten basierend auf dem Vorlagenparameter korrekt angewendet wird.

Das obige ist der detaillierte Inhalt vonWarum funktioniert „if constexpr' nicht in nicht auf Vorlagen basierenden Funktionen 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