Variance du comportement SFINAE dans les types de retour par rapport aux paramètres du modèle
En C, l'idiome SFINAE (Substitute Failure Is Not an Error) autorise le conditionnel surcharges de fonctions basées sur la métaprogrammation de modèles et les traits de type. Cependant, il existe des cas où SFINAE se comporte différemment selon son emplacement dans la déclaration du modèle de fonction.
Considérez le code suivant :
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;
Dans le premier ensemble de surcharges (placement incorrect), placer SFINAE dans les paramètres du modèle plutôt que dans le type de retour entraîne une erreur de compilation. En effet, les arguments du modèle par défaut (dans ce cas, le suffixe ::type) ne sont pas pris en compte pour déterminer l'équivalence de surcharge. Par conséquent, le compilateur traite les fonctions comme des déclarations en double avec la même signature.
Cependant, dans le deuxième ensemble de surcharges (placement correct), SFINAE est appliqué au type de retour, ce qui implique une métaprogrammation de modèle. Ce placement garantit que l'expression faisant référence aux paramètres du modèle fait partie de la signature de la fonction. De ce fait, le compilateur reconnaît les surcharges comme des entités distinctes, permettant à SFINAE de fonctionner correctement.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!