Warum gibt es einen Unterschied zwischen dem Konstruktor oder der Zuweisung von std :: function?

8

Der Löschcodekonstruktor std::function ist definiert als:

%Vor%

Der Zuweisungsoperator ist definiert als:

%Vor%

(Quelle cppreference)

Warum erhält der Konstruktor f nach Wert und operator= bekommt f durch Weiterleitungsreferenz?

    
RTempete 13.09.2016, 13:31
quelle

1 Antwort

3

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).

    
Yakk 13.09.2016 14:17
quelle