Heim >Backend-Entwicklung >C++ >Warum fehlt „std::function' der Gleichheitsvergleich?
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:
<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 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.
Das Rätsel wurde gelöst:
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 es durchgesetzt würde, würde es 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.
Das obige ist der detaillierte Inhalt vonWarum fehlt „std::function' der Gleichheitsvergleich?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!