In der Diskussion hatten wir hier Ich spielte mit dem Passspiel herum Funktoren. C ++ STL übergibt Funktoren als Werte (in std::for_each
, std::find_if
, std::transform
)
Also erklärte ich, dass meins so wäre.
%Vor% Nun könnte der Aufruf von call_me(ftor{})
wahrscheinlich den Kopierkonstruktor von ftor
aufrufen (es wird höchstwahrscheinlich kopiergeschützt sein, also nicht der Fall). Aber ftor f{}; call_me(f);
wird zum Kopieren führen. Wenn ftor
große Daten enthält, könnte dies ein Problem sein.
Wir werden es verbessern, indem wir es als const-Referenz übergeben ( void call_me(const F& f)
), um unnötige Kopien loszuwerden. Das ist in Ordnung, solange ftor::operator()
const
ist. Wenn dies nicht der Fall ist, würde der Aufruf von call_me
zu einem Kompilierungsfehler führen (Verlust von const
Qualifikationsmerkmalen).
Also, warum sollte man sich mit der const-Referenz beschäftigen, verwenden Sie nur die Referenz ( void call_me(F& f)
). Dies ist in Ordnung, aber es würde nicht funktionieren, wenn der erste Fall call_me(ftor{})
ist, da das Binsing von r-Wert zu (nichtkonstanter) l-Wert-Referenz nicht gültig ist.
Die Angabe von f
als Weiterleitungsreferenz ( void call_me(F&& f)
) scheint in allen Fällen zu funktionieren. Ich glaube, das funktioniert dank Referenzzusammenbruch.
Warum werden Template-Funktoren nicht als Weiterleitungsreferenzen in Funktionen von STL übergeben?
Warum werden Template-Funktoren nicht als R-Wert-Referenzen in Funktionen von STL übergeben?
Zunächst würden sie Weiterleitungen , nicht rvalue-Verweise weiterleiten.
Wie bei vielen "Warum" -Fragen zum Sprachdesign im Allgemeinen kann die Antwort einfach lauten: Weil niemand diese Änderung bereits vorgeschlagen hat (siehe wie man ein Angebot einreicht ). Ich vermute, dass eine große Menge von Funktionsobjekten, die in die Standardbibliotheksalgorithmen eingegeben wurden, entweder lambdas, zustandslos oder extrem billig kopierbar sind. Außerdem, wenn Sie ein so teures Objekt haben, können Sie es für den Zweck des Algorithmus immer in ein billig kopierbares verwandeln:
%Vor%Schließlich sind einige dieser Algorithmen darauf angewiesen, diese Funktionsobjekte an andere Helfer weiterzugeben. Wenn der Algorithmus einfach davon ausgeht, dass das Funktionsobjekt "frei" zu kopieren ist, ist es einfach zu codieren. Wenn wir hier die Möglichkeit von Rvalues einführen, fügt dies eine weitere Ebene von Fragen hinzu, die behandelt werden müssen - geben wir einfach die Referenz um? Was ist mit Funktionsobjekten mit ref-qualifiziertem% co_de%?
Eine Kombination der oben genannten Gründe erklärt wahrscheinlich, warum z. B. immer noch:
%Vor%und nicht
%Vor%