Berücksichtigen Sie die folgende Vorlagenfunktion:
template <typename T> inline T getValue(AnObject&) { static_assert(false, "this function has to be implemented for desired type"); }
Beim Kompilieren mit g 4.6.3, obwohl kein Aufruf erfolgt Wenn Sie diese Funktion irgendwo verwenden, schlägt die Kompilierung mit folgendem Fehler fehl:
static_assertion failed "this function has to be implemented for the desired type"
Dieses Verhalten wirft möglicherweise Fragen auf, da die Funktion nicht aufgerufen wird und keinen Kompilierungsfehler auslösen sollte. Allerdings gilt gemäß dem C-Standard in [temp.res]/8:
If no valid specialization can be generated for a template definition, and that template is not instantiated, the template definition is ill-formed, no diagnostic required.
Da es keine praktikable Möglichkeit gibt, die Funktionsvorlage mit einer gültigen Spezialisierung zu instanziieren, die kompiliert werden würde, wird die Vorlagendefinition selbst berücksichtigt schlecht geformt. Dadurch kann der Compiler es ablehnen, noch bevor eine Instanziierung erfolgt.
Um dieses Problem zu beheben und eine verzögerte Fehlererkennung zu ermöglichen, kann die Vorlagenfunktion 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"); }
Durch die Verwendung von Wenn Sie eine zusätzliche Template-Struktur foobar als Flag zur Kompilierungszeit verwenden, kann der Compiler die Funktionsvorlage nicht sofort ablehnen. Bei der Instanziierung wird die entsprechende Spezialisierung von foobar
Das obige ist der detaillierte Inhalt vonWarum schlägt eine statische Behauptung in einer nicht aufgerufenen Vorlagenfunktion fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!