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'accompagne « 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 :
struct S {
operator bool() { return false; }
};
int main() {
S a, b;
bool are_equal(a == b); // Uses operator bool on a and b!
}
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 std::function égalité 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.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3