Pourquoi std::function n'est-il pas comparable en égalité ?
Malgré son utilisation répandue, std::function n'est pas comparable en égalité. Cette limitation, également applicable à boost::function et std::tr1::function, trouve ses racines dans des considérations de conception du langage.
Opérateurs initialement supprimés
Dans un au début du projet C 11, les opérateurs d'égalité pour std::function ont été déclarés supprimés, avec le commentaire "les surcharges supprimées ferment un trou possible dans le système de types". Cette vague affirmation nous laisse interroger sur la nature de ce « trou ».
La « faille » de conversion de type booléen
Selon la spécification TR1, l'égalité non déclarée les opérateurs pour std::function visent à combler une faille créée par les conversions de type booléen. Ces conversions permettent de comparer les instances de fonction via == et !=.
L'exception std::shared_ptr
Contrairement à std::function, std::shared_ptr a sémantique d’égalité bien définie. Deux pointeurs sont considérés comme égaux s’ils sont tous deux vides ou non vides et pointant vers le même objet. En effet, le rôle de std::shared_ptr est plus simple et sa sémantique d'égalité peut être facilement définie.
Complexité et équivalence
La mise en œuvre d'une comparaison d'égalité pour std::function serait exigent que tous les types appelables soient comparables en termes d’égalité, ce qui n’est pas toujours réalisable. De plus, tester l'équivalence des fonctions peut s'avérer difficile, en particulier lorsqu'elles ont des liaisons d'arguments différentes.
Conclusion
Bien que std::function fournisse un moyen pratique de travailler avec divers types appelables, son manque de comparabilité en matière d'égalité a été un choix de conception délibéré. Éviter les failles potentielles et tenir compte de la diversité des types appelables étaient les principales considérations derrière cette décision.
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!