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>
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!