Od Josuttis „s C++ Standardowa biblioteka
Nie muszą i nie powinny przejść() wartości zwracanych. Zgodnie z regułami języka, norma określa, że na następny kod jest gwarantowana
X foo()
{
X x;
...
return x;
}
następujące zachowanie:
• Jeżeli X ma dostępną kopię lub przenieść konstruktora, kompilator może wybrać abstrahować Kopiuj. Jest to tak zwana (zwana) wartość zwracana optymalizacja ((N) RVO), która została określona nawet przed C++ 11 i jest obsługiwana przez większość kompilatorów.
• W przeciwnym razie, jeśli X ma konstruktor ruchu, przesunięto x.
• W przeciwnym razie, jeśli X ma konstruktora kopiowania, kopiowane jest x.
• W przeciwnym razie zostanie wygenerowany błąd podczas kompilacji.
Od §25.2.4 (for_each)
Wymaga: Funkcja musi spełniać wymogi MoveConstructible (tabela 20). [Uwaga: Funkcja nie musi spełniać wymagania CopyConstructible (tabela 21) .- koniec Uwaga]
Z std::move(f)
można być gwarantowane jest w stanie odczytać z zewnątrz zmutowany stan.
W tym przypadku zwracanie 'std :: move (f)' jest * prawie * równoważne zwracaniu 'f'. C++ 11 zabrania optymalizacji wartości zwracanej dla parametrów funkcji (ale nadal pozwala na niejawny ruch dla nich). Tak więc wydaje mi się, że jedyną różnicą jest to, że 'return f;' wraca do uznania go za lwartość, jeśli wartość rna spowodowałaby nadmierną dwuznaczność lub nie znalazłaby żadnego konstruktora. Ale "ruch powrotny (f)" w takim przypadku zawiedzie ze złym kształtowaniem. –
Na przykład zachowanie będzie inne dla 'funkcji', która jest zdefiniowana jak ta' struct Funkcja {funkcja (funkcja &); }; '. Ta klasa nie ma konstruktora ruchu i konstruktora kopiowania, który nie akceptuje wartości r. Zwrot 'move (f) 'byłby zatem źle sformułowany, podczas gdy' return f; 'byłby dobrze sformułowany. –
Ale znowu nie jestem pewien, jakie ograniczenia bibliotek dla obiektów funkcji są. Być może wymagają one, aby funkcja "function" była kopiowalna do inicjalizacji z rvalues. W takim razie nie byłoby żadnych różnic, o ile widzę. –