Heim >Backend-Entwicklung >C++ >Warum schlägt die Kompilierung von „static_assert' für eine nicht aufgerufene Vorlagenfunktion fehl?

Warum schlägt die Kompilierung von „static_assert' für eine nicht aufgerufene Vorlagenfunktion fehl?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-09 00:35:02608Durchsuche

Why Does `static_assert` Fail Compilation for an Uncalled Template Function?

Warum schlägt die Kompilierung von static_assert für eine nicht aufgerufene Vorlagenfunktion fehl?

Bei Verwendung der Vorlage static_assert wird erwartet, dass die Assertion nur dann fehlschlägt, wenn die Vorlagenfunktion instanziiert wird. In bestimmten Fällen, wie dem unten angesprochenen, schlägt die Kompilierung jedoch fehl, noch bevor die Funktion aufgerufen wird:

template <typename T>
inline T getValue(AnObject&)
{
    static_assert(false , "this function has to be implemented for desired type");
}

Erklärung

Gemäß dem C-Standard in [temp.res]/ 8:

"Wenn für eine Vorlagendefinition keine gültige Spezialisierung generiert werden kann und diese Vorlage nicht instanziiert wird, ist die Vorlagendefinition fehlerhaft und es gibt keine Diagnose erforderlich.“

In der bereitgestellten Vorlage kann keine gültige Spezialisierung generiert werden, da die static_assert-Bedingung immer falsch ist. Daher ist die Vorlagendefinition falsch formuliert. Auch wenn es nicht instanziiert ist, kann es sein, dass der Compiler es vorzeitig ablehnt.

Lösung

Um dieses Problem zu beheben, kann die Vorlage 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");
}

Auf diese Weise , kann der Compiler die Funktionsvorlage nicht sofort ablehnen, da er die entsprechende Spezialisierung von foobar instanziieren muss, bevor er die static_assert-Bedingung auswertet. Infolgedessen tritt der Kompilierungsfehler nur auf, wenn die Funktion tatsächlich instanziiert wird und die Behauptung fehlschlägt.

Das obige ist der detaillierte Inhalt vonWarum schlägt die Kompilierung von „static_assert' für eine nicht aufgerufene Vorlagenfunktion 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