Maison > développement back-end > C++ > Pourquoi les fonctions C 11 supprimées participent-elles toujours à la résolution des surcharges ?

Pourquoi les fonctions C 11 supprimées participent-elles toujours à la résolution des surcharges ?

Linda Hamilton
Libérer: 2024-12-23 10:13:18
original
271 Les gens l'ont consulté

Why Do Deleted C  11 Functions Still Participate in Overload Resolution?

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);
};
Copier après la connexion

Si = delete supprimait entièrement la fonction, elle aurait le même effet comme ceci :

struct onlydouble2 {
  onlydouble2(double);
};
Copier après la connexion

Dans ce cas, le code suivant serait valide :

onlydouble2 val(20);
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal