Das Rätsel:
Warum ist std::function, ein integraler Bestandteil moderner C-Codebasen, nicht mit Gleichheitsvergleichsfunktionen ausgestattet? Diese Frage hat Programmierer seit ihrer Einführung verwirrt und zu Verwirrung und Schwierigkeiten bei der Verwaltung von Sammlungen aufrufbarer Objekte geführt.
Die frühe Mehrdeutigkeit:
In einem frühen Entwurf des C 11-Standards wurden Überladungen für „operator==“ und „operator!=“ deklariert, aber gelöscht, was eine Lücke hinterließ, die nie ausreichend erklärt wurde. Der begleitende Kommentar „Mögliche Lücke im Typsystem schließen“ deutete auf einen versteckten Fehler hin, dessen Natur jedoch ein Rätsel blieb.
Die Lücke und der Schutz:
Die Die vermutete „Lücke“ ist auf das Vorhandensein einer booleschen Konvertierungsfunktion zurückzuführen. Wenn keine expliziten Gleichheitsvergleichsoperatoren vorhanden sind, kann diese Funktion implizite Vergleiche über == oder != ermöglichen. Diese Lücke kann jedoch zu unerwartetem Verhalten führen, wie Folgendes zeigt:
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 führte das Safe-Bool-Idiom ein und C 11 implementierte eine explizite Bool-Konvertierungsfunktion, um diese Lücke zu verhindern.
Der Kontrast zu std::shared_ptr:
Im Gegensatz zu std::function verfügt std::shared_ptr über eine klar definierte Gleichheitssemantik. Zwei Zeiger sind gleich, wenn sie beide leer sind oder wenn sie beide nicht leer sind und auf dasselbe Objekt zeigen. Diese klare Definition ermöglichte die Implementierung von Gleichheitsvergleichsoperatoren in std::shared_ptr.
The Enigma Unraveled:
Die Gründe dafür, die Gleichheit von std::function nicht vergleichbar zu machen ergibt sich aus der inhärenten Herausforderung, ein sinnvolles Gleichheitskriterium für beliebige aufrufbare Typen zu definieren. Wenn dies durchgesetzt würde, würde dies eine Belastung für alle Funktionsobjektimplementierer darstellen und könnte dennoch zu mehrdeutigen Vergleichen aufgrund von Unterschieden in den Bindungsargumenten führen. Darüber hinaus schließt das Fehlen von Gleichheitsoperatoren effektiv die Lücke, die durch implizite Konvertierungen entsteht.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3