In discussione avevamo here Stavo giocando con i funtori che passavano. C++ STL passa funtori come valori (visto in std::for_each
, std::find_if
, std::transform
)Perché il functor basato su modelli è passato come valore e non ha inoltrato il riferimento
Così dichiarando miniera sarebbe come questo.
template<typename F>
void call_me(F f)
{
f();
}
Ora, chiamando probabilmente potrebbe invocare ftor
's costruttore di copia (che molto probabilmente sarà la copia eliso, quindi non è il caso). Ma ftor f{}; call_me(f);
provocherà la copia. Se ftor
ha grandi dati, potrebbe essere un problema.
Lo miglioreremo passandolo come riferimento const (void call_me(const F& f)
) per eliminare la copia non necessaria. Questo va bene finchè ftor::operator()
è const
. In caso contrario, la chiamata a call_me
comporterebbe un errore di compilazione (perdita di qualificatori const
).
Quindi, perché preoccuparsi di riferimento const, utilizzare solo riferimento (void call_me(F& f)
). Questo va bene, ma non funzionerebbe perché il primo caso fosse poiché il binsing del valore r su (non-const) il riferimento al valore-l non è valido.
Dichiarare f
come riferimento di inoltro (void call_me(F&& f)
) sembra funzionare in tutti i casi. Credo che questo funzioni grazie al riferimento al collasso.
Quindi, perché i funtori basati su modelli non vengono inoltrati come riferimenti di inoltro nelle funzioni da STL?