Diciamo che ho questa funzione:Comportamento della funzione template C++
bool f(int&& one, int&& two) { }
Se tento di chiamare con questo codice:
int x = 4;
f(x, 5);
il compilatore si lamenta che non può convertire x da lvalue riferimento al riferimento di rvalue, che è corretto.
Ora, se converto f in una funzione di modello come questo:
template <class T, class U>
bool f(T&& one, U&& two) { }
poi mi può chiamare con un riferimento lvalue:
int x = 5;
f(x, 5);
Perché è così? Perché il compilatore non si lamenta in questo caso?
Mentre il collasso di riferimento si verifica nel caso di un "riferimento universale", la vera magia avviene prima di questo passaggio e si verifica durante la deduzione degli argomenti del modello. La tua nota sul crollo dei riferimenti che non funziona in una funzione normale è semplicemente sbagliata; il collasso di riferimento può avvenire ovunque: 'usando T = int &&; void foo (T & x); 'qui x è un 'int &' a causa di un collasso di riferimento. – Simple
@Simple sembra proprio giusto, sapevo già che decltypes e auto potevano avere un riferimento al collasso, non sapevo che un typedef poteva causarlo, io Modificherò la mia risposta – aaronman