Résolution de surcharge en C 11 avec fonctions supprimées
C 11 permet l'utilisation de la syntaxe = delete pour marquer les fonctions comme "supprimées". " Cette syntaxe empêche le compilateur de générer le corps de la fonction et interdit son invocation directe. Cependant, ces fonctions supprimées participent toujours à la résolution de surcharge, un processus qui détermine la fonction la plus appropriée à appeler en fonction d'un ensemble de paramètres d'entrée.
Pourquoi cette fonctionnalité est-elle utile ? Pourquoi les fonctions supprimées sont-elles masquées au lieu d'être complètement supprimées du code ?
La raison principale est de désactiver des surcharges spécifiques en fonction des types de paramètres. En participant à la résolution des surcharges, les fonctions supprimées empêchent les conversions implicites qui pourraient conduire à un comportement involontaire. Prenons l'exemple suivant :
struct onlydouble { onlydouble(std::intmax_t) = delete; onlydouble(double); };
Si delete supprimait entièrement la fonction, la syntaxe = delete serait effectivement équivalente à :
struct onlydouble2 { onlydouble2(double); };
Avec ce changement, le code suivant serait légal :
onlydouble2 val(20);
Le compilateur tenterait de convertir implicitement le littéral entier 20 en double avant d'invoquer le constructeur qui prend un double.
En revanche, dans l'exemple original avec le constructeur supprimé, le compilateur détecterait une correspondance exacte entre les paramètres de la fonction (std::intmax_t) et l'argument (20). Il générerait alors une erreur car il a sélectionné une fonction supprimée pour l'invocation.
La syntaxe = delete permet donc un contrôle plus fort sur les fonctions qui sont appelées en fonction des types de paramètres. Il empêche les conversions implicites qui pourraient entraîner des conséquences inattendues.
De plus, le concept « cela n'existe pas » n'est pas nécessaire dans la spécification C car :
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!