Einführung:
Compilerfehler können verwirrend sein, insbesondere wenn sie durch Aufrufe von Funktionen entstehen die scheinbar unbenutzt sind. In diesem Fall verursacht eine static_assert-Anweisung innerhalb einer Vorlagenfunktion Kompilierungsfehler, obwohl die Funktion nicht explizit aufgerufen wird. In diesem Artikel werden die Gründe für dieses Verhalten untersucht und eine mögliche Problemumgehung vorgeschlagen.
Vorlagenfunktion und Kompilierungsfehler:
Die folgende Vorlagenfunktion löst einen Kompilierungsfehler aus:
template <typename T> inline T getValue(AnObject&) { static_assert(false , "this function has to be implemented for desired type"); }
Beim Kompilieren erscheint die folgende Fehlermeldung:
static_assertion failed "this function has to be implemented for the desired type"
Grund für den Fehler:
Gemäß dem C-Standard (insbesondere [temp.res]/8) , gilt eine Vorlagendefinition als fehlerhaft, wenn keine gültige Spezialisierung generiert werden kann und die Vorlage nicht instanziiert bleibt. In diesem Fall erkennt der Compiler keine gültigen Spezialisierungen für die Vorlagenfunktion getValue und betrachtet sie daher als fehlerhaft. Infolgedessen schlägt die Kompilierung der static_assert-Anweisung fehl, obwohl die Funktion nicht aufgerufen wurde.
Mögliche Problemumgehung:
Eine mögliche Möglichkeit, den Kompilierungsfehler zu vermeiden und gleichzeitig die beabsichtigte Funktionalität beizubehalten besteht darin, eine Hilfsstruktur zu verwenden:
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"); }
Durch die Verwendung der Hilfsstruktur foobar kann der Compiler die Vorlagenfunktion nicht mehr sofort ablehnen, da er nicht bestimmen kann, ob eine gültige Spezialisierung von foobar mit dem Wert == true vorliegt später instanziiert. Wenn die Vorlagenfunktion schließlich instanziiert wird, wird die entsprechende Spezialisierung von foobar generiert und die static_assert-Anweisung schlägt wie erwartet fehl.
Das obige ist der detaillierte Inhalt vonWarum schlägt die Kompilierung von „static_assert' trotz einer nicht aufgerufenen Vorlagenfunktion fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!