SFINAE-Verhaltensvarianz in Rückgabetypen im Vergleich zu Vorlagenparametern
In C erlaubt das SFINAE-Idiom (Substitute Failure Is Not an Error) bedingte Bedingungen Funktionsüberladungen basierend auf Template-Metaprogrammierung und Typmerkmalen. Es gibt jedoch Fälle, in denen sich SFINAE abhängig von seiner Platzierung in der Funktionsvorlagendeklaration unterschiedlich verhält.
Beachten Sie den folgenden Code:
template<typename T, typename = typename std::enable_if< std::is_integral<T>::value>::type> void foo(T); // Incorrect placement, triggers error template<typename T, typename = typename std::enable_if< std::is_floating_point<T>::value>::type> void foo(T); // Incorrect placement, triggers error template<typename T> void foo(T) // Correct placement -> typename std::enable_if< std::is_integral<T>::value>::type; template<typename T> void foo(T) // Correct placement -> typename std::enable_if< std::is_floating_point<T>::value>::type;
Im ersten Satz von Überladungen (falsche Platzierung) Das Platzieren von SFINAE in den Vorlagenparametern statt im Rückgabetyp führt zu einem Kompilierungsfehler. Dies liegt daran, dass Standardvorlagenargumente (in diesem Fall das Suffix ::type) bei der Bestimmung der Überladungsäquivalenz nicht berücksichtigt werden. Folglich behandelt der Compiler die Funktionen als doppelte Deklarationen mit derselben Signatur.
Im zweiten Satz von Überladungen (richtige Platzierung) wird jedoch SFINAE auf den Rückgabetyp angewendet, was eine Vorlagen-Metaprogrammierung beinhaltet. Durch diese Platzierung wird sichergestellt, dass der Ausdruck, der sich auf Vorlagenparameter bezieht, Teil der Funktionssignatur ist. Infolgedessen erkennt der Compiler die Überladungen als unterschiedliche Einheiten, sodass SFINAE ordnungsgemäß funktioniert.
Das obige ist der detaillierte Inhalt vonWie unterscheidet sich das SFINAE-Verhalten zwischen Rückgabetypen und Vorlagenparametern bei C-Funktionsüberladungen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!