Obiekty funkcyjne zwykle powinny być małe, więc nie sądzę, że przekazywanie ich wartościami będzie odczuwalnie zauważalne (porównaj to z pracą, jaką funkcja pełni w swoim ciele). Jeśli przeszedłeś przez wartość, możesz również zyskać na analizie kodu, ponieważ parametr value według wartości jest lokalny dla funkcji, a optymalizator może określić, kiedy i kiedy nie można pominąć obciążenia z elementu danych funktora.
Jeśli funktor jest bezpaństwowcem, podanie go jako argumentu nie wiąże się z żadnymi kosztami - bajt wypełnienia, który pobiera funktor, nie musi mieć żadnej konkretnej wartości (w Itanium Abi używanym przynajmniej przez GCC). Podczas korzystania z referencji zawsze musisz podać adres.
Ostatni (const T&
) ma tę wadę, że w C++ 03 nie działa dla surowych funkcji, ponieważ w C++ 03 program jest źle sformułowany, jeśli spróbujesz zastosować const
do typu funkcji (i jest przypadkiem SFINAE). Nowsze implementacje zamiast ignorować const
po zastosowaniu na typy funkcji.
Drugi (T&
) ma oczywistą wadę, że nie można przekazać tymczasowych funktorów.
Krótko mówiąc, ogólnie rzecz biorąc, przekazywałbym je według wartości, chyba że widzę wyraźną korzyść w konkretnych przypadkach.
STL zwykle stosuje pierwsze podejście, ponieważ wiele problemów powstaje podczas korzystania z pojemników z referencjami itp. –
Tak samo, jak wszędzie indziej: w zależności od tego, czym jest "F", wersje te mogą być różne, od identycznych do bardzo różnych. Jeśli 'F' jest stateful, tylko środkowa wersja może być możliwa. –
Zasadniczo stawiasz wymagania swoim użytkownikom niezależnie od wybranej formy. Jeśli pod względem wartości, wymagasz od nich funktora, który można skopiować bez utraty integralności. Jeśli przez odniesienie musisz wymagać, aby dali ci coś w życiu odpowiedniego dla każdego użytkownika, który go umieszcza. – Mordachai