Heim >Backend-Entwicklung >C++ >Warum schlägt die Kompilierung von „static_assert' für eine nicht aufgerufene Vorlagenfunktion fehl?
Bei Verwendung der Vorlage static_assert wird erwartet, dass die Assertion nur dann fehlschlägt, wenn die Vorlagenfunktion instanziiert wird. In bestimmten Fällen, wie dem unten angesprochenen, schlägt die Kompilierung jedoch fehl, noch bevor die Funktion aufgerufen wird:
template <typename T> inline T getValue(AnObject&) { static_assert(false , "this function has to be implemented for desired type"); }
Gemäß dem C-Standard in [temp.res]/ 8:
"Wenn für eine Vorlagendefinition keine gültige Spezialisierung generiert werden kann und diese Vorlage nicht instanziiert wird, ist die Vorlagendefinition fehlerhaft und es gibt keine Diagnose erforderlich.“
In der bereitgestellten Vorlage kann keine gültige Spezialisierung generiert werden, da die static_assert-Bedingung immer falsch ist. Daher ist die Vorlagendefinition falsch formuliert. Auch wenn es nicht instanziiert ist, kann es sein, dass der Compiler es vorzeitig ablehnt.
Um dieses Problem zu beheben, kann die Vorlage wie folgt geändert werden:
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 desired type"); }
Auf diese Weise , kann der Compiler die Funktionsvorlage nicht sofort ablehnen, da er die entsprechende Spezialisierung von foobar instanziieren muss, bevor er die static_assert-Bedingung auswertet. Infolgedessen tritt der Kompilierungsfehler nur auf, wenn die Funktion tatsächlich instanziiert wird und die Behauptung fehlschlägt.
Das obige ist der detaillierte Inhalt vonWarum schlägt die Kompilierung von „static_assert' für eine nicht aufgerufene Vorlagenfunktion fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!