Heim > Backend-Entwicklung > C++ > Hauptteil

Warum schlägt ein statisches Assert in einer nicht aufgerufenen Vorlagenfunktion in C 0x fehl?

Mary-Kate Olsen
Freigeben: 2024-11-06 16:42:03
Original
147 Leute haben es durchsucht

Why Does a Static Assert Fail in an Uncalled Template Function in C  0x?

Static_Assert-Fehler trotz nicht aufgerufener Vorlagenfunktion

In C 0x können Vorlagen mit nicht verwendeten static_assert-Deklarationen zu Kompilierungsfehlern führen. Betrachten Sie den folgenden Code:

template <typename T>
inline T getValue(AnObject&)
{
    static_assert(false, "this function has to be implemented for the desired type");
}
Nach dem Login kopieren

Überraschenderweise schlägt dieser Code mit dem Fehler fehl:

static_assertion failed "this function has to be implemented for the desired type"
Nach dem Login kopieren

Intuitiv würde man erwarten, dass der Compiler die Vorlagenfunktion nur dann instanziiert, wenn sie aufgerufen wird. Der C-Standard legt jedoch in [temp.res]/8 etwas anderes fest:

Für eine Vorlagendefinition, für die eine gültige Spezialisierung generiert werden kann, darf keine Diagnose ausgegeben werden. Wenn für eine Vorlagendefinition keine gültige Spezialisierung generiert werden kann und diese Vorlage nicht instanziiert wird, ist die Vorlagendefinition fehlerhaft und es ist keine Diagnose erforderlich.

Da es keine gültige Spezialisierung zum Kompilieren gibt, ist der Compiler zulässig um die Vorlagendefinition abzulehnen, unabhängig davon, ob sie instanziiert wird.

Um dieses Problem zu beheben, kann man den Code wie folgt neu definieren:

template<typename T>
struct foobar : std::false_type
{ };

template <typename T>
inline T getValue(AnObject&)
{
    static_assert(foobar<T>::value, "this function has to be implemented for the desired type");
}
Nach dem Login kopieren

Diese Änderung verschiebt die Diagnose auf die Instanziierung des entsprechende foobar Spezialisierung, um sicherzustellen, dass die Vorlagendefinition bis dahin wohlgeformt ist.

Das obige ist der detaillierte Inhalt vonWarum schlägt ein statisches Assert in einer nicht aufgerufenen Vorlagenfunktion in C 0x fehl?. 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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!