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
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!