Pourquoi la résolution surchargée inclut les fonctions supprimées C 11
C 11 a introduit la syntaxe = delete, qui marque les fonctions comme « supprimées », empêchant leur invocation. Cela soulève la question de savoir pourquoi ces fonctions participent toujours à la résolution des surcharges au lieu d'être complètement éliminées.
L'objectif principal de = delete est d'empêcher l'invocation de fonctions spécifiques avec certains paramètres. Il vise à interdire les conversions implicites, en particulier dans les scénarios où elles pourraient entraîner des conséquences inattendues. Par conséquent, la participation à la résolution des surcharges est essentielle pour que = delete interdise efficacement des surcharges particulières.
Considérons l'exemple suivant :
struct onlydouble { onlydouble(std::intmax_t) = delete; onlydouble(double); };
Si = delete supprimait entièrement la fonction, elle aurait le même effet comme ceci :
struct onlydouble2 { onlydouble2(double); };
Dans ce cas, le code suivant serait valide :
onlydouble2 val(20);
Le compilateur tenter d'invoquer le constructeur qui prend un entier, mais convertirait implicitement 20 en double et invoquerait avec succès le constructeur qui prend un double.
Cependant, avec = delete, l'invocation du seul constructeur double qui prend un intmax_t est explicitement interdit. Le compilateur ne tentera pas de conversions implicites et générera à la place une erreur, empêchant l'utilisation de cette surcharge interdite.
De plus, = delete implique "J'interdis cela" plutôt que "cela n'existe pas". La spécification C ne définit pas la notion de fonction « inexistante ». Au lieu de cela, il fournit un mécanisme pour interdire explicitement certaines invocations, permettant au programmeur de contrôler le comportement du compilateur et d'empêcher les conversions implicites indésirables.
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!