Heim  >  Artikel  >  Backend-Entwicklung  >  Warum führt die Verwendung von „std::enable_if_t“ mit Standardwerten zu einem Neudefinitionsfehler?

Warum führt die Verwendung von „std::enable_if_t“ mit Standardwerten zu einem Neudefinitionsfehler?

DDD
DDDOriginal
2024-11-12 11:24:02256Durchsuche

Why Does Using `std::enable_if_t` With Default Values Result in a Redefinition Error?

Neudefinitionsproblem mit enable_if_t-Vorlagenargumenten

Im bereitgestellten Code der Versuch, die Typbeschränkung std::enable_if mithilfe der neuen Syntax zu konvertieren (typename = std::enable_if_t...) führt zu einem Neudefinitionsfehler. Dies liegt daran, dass die beiden Vorlagenfunktionen:

template<typename T, typename = std::enable_if_t<std::is_same<int, T>::value>>>
void g() { }

und

template<typename T, typename = std::enable_if_t<std::is_same<double, T>::value>>>
void g() { }

beide vom Typ templatevoid() sind. Die Tatsache, dass das zweite Typargument unterschiedliche Standardwerte hat, ist irrelevant, da der Compiler die beiden Vorlagen als identisch betrachtet.

Um dieses Problem zu beheben, müssen die Standardwerte aus der Einschränkung „enable_if_t“ entfernt werden. Daraus ergibt sich folgender Code:

template<typename T, std::enable_if_t<std::is_same<int, T>::value, int>*>
void g() { }

template<typename T, std::enable_if_t<std::is_same<double, T>::value, int>*>
void g() { }

In diesem Fall ist das zweite Typargument nun ein Zeiger, dessen Typ vom ersten abhängig ist. Der Compiler kann den Typ T ersetzen, um festzustellen, ob ein Konflikt zwischen den beiden Vorlagen besteht, und er löst auf, dass kein Konflikt vorliegt.

Das obige ist der detaillierte Inhalt vonWarum führt die Verwendung von „std::enable_if_t“ mit Standardwerten zu einem Neudefinitionsfehler?. 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