Heim  >  Artikel  >  Backend-Entwicklung  >  Warum schlägt ein statisches Assert in einer nicht aufgerufenen Vorlagenfunktion in C 0x fehl?

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

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-06 16:42:03148Durchsuche

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");
}

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

static_assertion failed "this function has to be implemented for the desired type"

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");
}

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!

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