Wenn Sie die Referenz auf std::stable_sort
überprüfen, werden Sie sehen, dass die binary_function
, die Sie zur Verfügung gestellt, sollte auch ein Funktion Objekt sein ... Es gibt keinen Unterschied zwischen den beiden, außer dass vielleicht im zweiten Fall gibt es keine richtiger "Cast" oder Umwandlung von einer Funktion zu einem richtigen Funktionsobjekt.
Ich glaube, dies auf die Tatsache zurückzuführen sein, dass *sort
Funktionen die Funktors direkt verwenden und sofort, so dass, wenn die Funktion Adresse gültig ist, wenn die *sort
Funktion aufgerufen wird, wird es für die Dauer des Funktionsaufrufes gültig. Wenn Sie einen Container erstellen, der (im Wesentlichen) als Datenelement verwendet wird, können Sie nicht sicher sein, dass der Funktionsverweis während der Lebensdauer des Containerobjekts ungültig wird. Ich weiß, es ist eine lockere Handwaving-Erklärung, aber es ist das Beste, was ich mir vorstellen kann. Vielleicht wird in C++ der Verweis auf eine binäre Funktion implizit in die Konstruktion einer std::function
konvertiert, so dass die Funktion "kopiert" wird und es kein Gültigkeitsproblem gibt.
ich hoffe ich habe Sie jetzt nicht verloren ...
Im ersten Fall ist 'binary_function' der Name einer Instanz eines Funktionsobjekts oder der Name einer Funktion. Daher kann es im zweiten Fall nicht verwendet werden, wenn der Vorlagenparameter ein Typname (kein Variablen-/Funktionsname) sein muss. – visitor
Ein Funktionsobjekt ist trotzdem eine Klasse, oder? So etwas wie eine Struktur mit 'bool operator (arg)'. Ansonsten ist es nur eine Adresse einer Funktion, die natürlich auch verwendet werden kann, aber nicht in diesem Fall IMHO (wegen unbekannter Lebensdauerprobleme dieser Referenz) – rubenvb
Es gibt einen Unterschied zwischen einer Klasse und einer Instanz dieser Klasse. 'MyFunctor fun;' - 'MyFunctor' ist der Name der Klasse und' fun' ist der Name der Instanz. 'stable_sort' nimmt' fun' (leitet den Typ des Arguments ab) und das Template-Argument von priority_queue nimmt 'MyFunctor' an. – UncleBens