Pourquoi std::function n'est pas comparable à l'égalité
En C, std::function est un wrapper appelable générique qui vous permet de travailler avec des objets fonction arbitraires. Malgré son utilité, std::function ne prend pas en charge la comparaison d'égalité (==). Boost::function et std::tr1::function présentent le même comportement.
Contexte historique
Dans les versions antérieures de la norme C 11, std::function avait des surcharges pour les opérateurs d’égalité. Cependant, ces surcharges ont ensuite été déclarées supprimées, dans le but de combler un « trou possible dans le système de types ».
La « faille »
La « faille » " mentionné dans le projet C 11 concerne le potentiel de conversions booléennes implicites pouvant conduire à des comparaisons d'égalité inattendues. En C 03, l'idiome safe-bool a été introduit pour éviter ce problème, et en C 11, une fonction de conversion bool explicite a été introduite. Cependant, ces mesures n'éliminent pas complètement la possibilité de comparaisons d'égalité inattendues.
Considérations spécifiques à std::function
Contrairement à std::shared_ptr, qui a bien- sémantique d'égalité définie (l'égalité implique de pointer vers le même objet), std::function n'a pas de concept clair d'égalité. Considérez ce qui suit :
Conséquences de l'incomparabilité
L'incapacité de comparer les objets std::function comme égaux a certaines conséquences :
Conclusion
Bien que l'absence de comparaison d'égalité pour std::function puisse être gênante dans certains scénarios, elle empêche en fin de compte les vulnérabilités potentielles du système de types et garantit la cohérence du comportement de la fonction dans les différentes implémentations. Pour les applications nécessitant une comparaison d'égalité, des solutions alternatives peuvent être utilisées, telles que l'utilisation d'une classe wrapper avec des remplacements d'égalité explicites.
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!