Non riesco a capire cosa succede esattamente quando si passa un riferimento su funzione a una funzione come riferimento universale (quale tipo viene dedotto). Supponiamo di avere una funzione foo che prende un parametro come riferimento universale:Passaggio di un riferimento alla funzione come riferimento universale
template<typename T>
void foo(T&& param)
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
E poi facciamo il seguente:
void(&f)(int) = someFunction;
foo(f);
Il risultato sarà:
void foo(T&&) [with T = void (&)int]
Questo è perfettamente comprensibile: stiamo passando lvalue alla nostra funzione foo, quindi il tipo dedotto è nullo (&) int, e il tipo del parametro sarà "void (& & &) int" che sotto riferimento le regole di compressione diventano nulle (&) int. Param sarà solo un riferimento lvalue a una funzione.
Ma quando faccio la seguente:
void(&f)(int) = someFunction;
foo(std::move(f));
foo stamperà:
void foo(T&&) [with T = void (&)int]
che è esattamente la stessa di prima! Cosa sta succedendo qui? Perché il risultato è lo stesso di quando passa lvalue? Mi aspetterei che dato che stiamo passando rvalue a foo, il tipo dedotto dovrebbe essere T = void (int), e param dovrebbe diventare void (& &) int. Questo succede sempre con tutti gli altri tipi "normali" (come classi, tipi primitivi, ecc.) Perché è diverso quando si tratta di riferimenti alle funzioni?
Nah. 'param' ha un nome, è un lvalue per definizione. –
@KerrekSB Scusa ma è sbagliato - http: // StackOverflow.it/questions/7016777/what-is-an-rvalue-reference-to-function-type –
@rubix_addict: Il mio male, grazie! Rimosso. Avevo dopo la dichiarazione che è parte della risposta, ma non ho capito bene. –