Statische Assertion schlägt trotz Null-Funktionsaufrufs fehl
Bei der Verwendung von g 4.6.3 mit dem c 0x-Flag sind Entwickler auf einen unerwarteten Kompilierungsfehler gestoßen :
template <typename T> inline T getValue(AnObject& {}) { static_assert(false, "this function has to be implemented for desired type"); }
Ergebnisse in:
static_assertion failed "this function has to be implemented for the desired type"
Dieser Fehler tritt auf, obwohl die Funktion nirgendwo im Code aufgerufen wird.
Erklärung
Laut dem C-Standard [temp.res]/8 ist die Vorlage falsch formatiert, wenn für eine nicht instanziierte Vorlagendefinition keine gültige Spezialisierung generiert werden kann. Obwohl der Compiler nicht verpflichtet ist, diesen Fehler zu diagnostizieren, ist es zulässig, die Vorlage abzulehnen.
Lösung
Ein Ansatz zur Lösung dieses Problems ist die Verwendung eines Typmerkmals um die statische Behauptung zu schützen:
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"); }
Mit dieser Änderung kann der Compiler die Vorlage nicht sofort ablehnen, da er die relevante Spezialisierung von foobar
Das obige ist der detaillierte Inhalt vonWarum schlägt die Kompilierung einer statischen Assertion trotz eines Null-Funktionsaufrufs fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!