pasar lambda como argumento, por referencia o valor?
He escrito un código de plantilla que toma un functor como argumento y después de un procesamiento, lo ejecuta. Aunque alguien más podría pasar esa función un lambda, un puntero de función o incluso unstd::function
pero está destinado principalmente a lambda (no es que prohíba otros formatos). Quiero preguntar cómo debo tomar esa lambda, ¿por valor? ¿por referencia? o algo mas.
Código de ejemplo -
#include <iostream>
#include <functional>
using namespace std;
template<typename Functor>
void f(Functor functor)
{
functor();
}
void g()
{
cout << "Calling from Function\n";
}
int main()
{
int n = 5;
f([](){cout << "Calling from Temp Lambda\n";});
f([&](){cout << "Calling from Capturing Temp Lambda\n"; ++n;});
auto l = [](){cout << "Calling from stored Lambda\n";};
f(l);
std::function<void()> funcSTD = []() { cout << "Calling from std::Function\n"; };
f(funcSTD);
f(g);
}
En el código anterior, tengo la opción de hacer cualquiera de estos:
template<typename Functor>
void f(Functor functor)
template<typename Functor>
void f(Functor &functor)
template<typename Functor>
void f(Functor &&functor)
¿Cuál sería la mejor manera y por qué? ¿Hay alguna limitación para alguno de estos?