Heim > Backend-Entwicklung > C++ > Warum schlägt eine statische Behauptung in einer nicht aufgerufenen Vorlagenfunktion fehl?

Warum schlägt eine statische Behauptung in einer nicht aufgerufenen Vorlagenfunktion fehl?

Susan Sarandon
Freigeben: 2024-11-12 07:58:01
Original
1027 Leute haben es durchsucht

Why Does a Static Assertion Fail in an Uncalled Template Function?

Static_Assert-Fehler trotz nicht aufgerufener Vorlagenfunktion

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");
}
Nach dem Login kopieren

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"
Nach dem Login kopieren

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.
Nach dem Login kopieren

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");
}
Nach dem Login kopieren

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 bestimmt, ob die statische Behauptung wie beabsichtigt fehlschlagen soll.

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage