Ich kann nur raten, aber ich würde vermuten, dass es darauf zurückzuführen ist, dass es zu C ++ hinzugefügt wurde, während rvalue Verweise und Weiterleitungen auf die Sprache verweist.
Einige Teile der API haben also Weiterleitungsreferenzen, andere nicht.
Es gibt einen kleinen Vorteil: Wenn der Kopierkonstruktor von F
werfen kann, während der Zug nicht möglich ist, kann std::function( F )
garantiert nicht werfen, während std::function( F const& )
nicht sein kann. Der Unterschied besteht darin, dass die Kopie außerhalb des Konstruktors im Fall template<class F> function(F)
, aber innerhalb des Konstruktors im Fall template<class F> function(F&&)
erfolgt, wenn ein Nicht-R-Wert übergeben wird.
Dies ist kein zwingender Grund.
Es würde es auch marginal einfacher machen, das SFINAE-Verhalten von function(F)
zu spezifizieren, aber das wurde erst lange nach C ++ 11 formalisiert, also kann das nicht der Grund sein.
Die Kosten für template<class F>function(F)
sind niedrig - eine Bewegung von F
gegenüber der perfekten Weiterleitungsversion - also war es wahrscheinlich nicht sehr wichtig, dass sich jemand in der Prioritätenliste änderte (besonders weil es eine subtile Veränderung in der "könnte" -Tests von function(F)
werfen und könnte daher theoretisch dazu führen, dass ein seltsamer Code bricht).
Tags und Links c++ c++11 perfect-forwarding std-function