Maison > développement back-end > C++ > Pourquoi « std :: function » manque-t-il de comparaison d'égalité ?

Pourquoi « std :: function » manque-t-il de comparaison d'égalité ?

Patricia Arquette
Libérer: 2024-10-30 04:36:28
original
280 Les gens l'ont consulté

Why Does `std::function` Lack Equality Comparison?

Démêler l'énigme de la comparaison des égalités de std::function

L'énigme :

Pourquoi std::function, un composant intégral des bases de code C modernes, non doté de capacités de comparaison d'égalité ? Cette question a laissé les programmeurs perplexes depuis sa création, entraînant une confusion et des difficultés dans la gestion des collections d'objets appelables.

La première ambiguïté :

Dans une première ébauche du C 11, les surcharges pour Operator== et Operator!= ont été déclarées mais supprimées, laissant un vide qui n'a jamais été correctement expliqué. Le commentaire qui l'accompagnait « fermer un trou possible dans le système de types » faisait allusion à un défaut caché, mais sa nature restait un mystère.

La faille et la sauvegarde :

Le La "faille" suspectée provient de la présence d'une fonction de conversion booléenne. En l'absence d'opérateurs de comparaison d'égalité explicites, cette fonction peut permettre des comparaisons implicites via == ou !=. Cependant, cette faille peut conduire à un comportement inattendu, comme le démontre :

<code class="cpp">struct S {
    operator bool() { return false; }
};

int main() {
    S a, b;
    bool are_equal(a == b); // Uses operator bool on a and b!
}</code>
Copier après la connexion

C 03 a introduit l'idiome safe-bool et C 11 a implémenté une fonction de conversion booléenne explicite pour éviter cette faille.

Le contraste avec std::shared_ptr:

Contrairement à std::function, std::shared_ptr a une sémantique d'égalité bien définie. Deux pointeurs sont égaux s’ils sont tous deux vides ou s’ils ne sont pas vides et pointent vers le même objet. Cette définition claire a permis la mise en œuvre d'opérateurs de comparaison d'égalité dans std::shared_ptr.

L'énigme dévoilée :

La justification pour ne pas rendre l'égalité std::function comparable découle du défi inhérent à la définition d’un critère d’égalité significatif pour les types appelables arbitraires. Si elle était appliquée, cela imposerait une charge à tous les implémenteurs d'objets fonction, et cela pourrait toujours conduire à des comparaisons ambiguës en raison des différences dans les arguments de liaison. De plus, l'absence d'opérateurs d'égalité comble efficacement la faille résultant des conversions implicites.

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