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

Warum kann ich „if constexpr' nicht in nicht auf Vorlagen basierenden Funktionen in C 17 verwenden?

Susan Sarandon
Susan SarandonOriginal
2024-11-06 04:13:02562Durchsuche

Why Can't I Use `if constexpr` in Non-Templated Functions in C  17?

C 17s „if constexpr“ auf Vorlagenfunktionen beschränkt

In C 17 hat die Einführung von „if constexpr“ Interesse daran geweckt Fähigkeit, Code basierend auf Konstanten zur Kompilierungszeit bedingt auszuführen. Es tritt jedoch ein Problem auf, wenn versucht wird, ihn in nicht auf Vorlagen basierenden Funktionen zu verwenden.

Beachten Sie den folgenden Code:

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

void print(auto value)
{
  // Compile-time check if value is a pointer
  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()
{
  // Error when printing a non-pointer
  print(100);
}</code>

Während dieser Code in auf Vorlagen basierenden Funktionen ohne Fehler kompiliert wird, schlägt er mit a fehl Kompilierungsfehler beim Platzieren in einer nicht auf einer Vorlage basierenden Funktion wie print. Der Grund liegt im Verhalten von „if constexpr“.

„if constexpr“ ist so konzipiert, dass es eine bedingte Kompilierung von Vorlagencode ermöglicht. In einer Vorlagenfunktion leitet der Compiler zur Kompilierungszeit den Typ des Parameters ab und ermöglicht so die Auswahl des geeigneten Codepfads basierend auf dem Typ. In diesem Fall kann die Druckfunktion bei Vorlage einer Vorlage erkennen, ob der Wert zur Kompilierungszeit ein Zeiger ist, und den entsprechenden Codezweig ausführen.

In einer Funktion ohne Vorlage ist jedoch der Typ des Werts bekannt nur zur Laufzeit, wodurch „if constexpr“ unwirksam wird. Der Compiler behandelt beide Zweige der Bedingung als ausführbaren Code, was zu einem Kompilierungsfehler führt, wenn versucht wird, den Wert im Ptr zu dereferenzieren, um zu verzweigen, wenn der Wert eine Ganzzahl ist.

Um dieses Problem zu vermeiden, ist es notwendig, „ if constexpr“ innerhalb einer Vorlagenfunktion oder stellen Sie der nicht vorlagenbasierten Funktion explizite Typinformationen zur Verfügung, um die Typableitung zur Kompilierungszeit sicherzustellen.

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