Heim  >  Artikel  >  Backend-Entwicklung  >  Warum schlägt die Kompilierung einer statischen Assertion trotz eines Null-Funktionsaufrufs fehl?

Warum schlägt die Kompilierung einer statischen Assertion trotz eines Null-Funktionsaufrufs fehl?

Barbara Streisand
Barbara StreisandOriginal
2024-11-06 00:09:02299Durchsuche

Why Does a Static Assertion Fail Compilation Despite a Null Function Invocation?

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 instanziieren muss. um den Wert der statischen Behauptung zu bestimmen, die trotzdem wie beabsichtigt fehlschlägt.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn