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?

Respuestas a la pregunta(2)

Su respuesta a la pregunta