Heim >Backend-Entwicklung >C++ >Warum fehlt „std::function' der Gleichheitsvergleich?

Warum fehlt „std::function' der Gleichheitsvergleich?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-30 04:36:28281Durchsuche

Why Does `std::function` Lack Equality Comparison?

Das Rätsel der Gleichheitsvergleichbarkeit von std::function lösen

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn