Powiedzmy mam tę funkcję:Zachowanie C++ funkcji szablonu
bool f(int&& one, int&& two) { }
Gdybym próbują nazwać z tym kodem:
int x = 4;
f(x, 5);
kompilator będzie narzekać, że nie można konwertować X z lwartości odniesienie do referencji rvalue, które jest poprawne.
Teraz jeśli przekonwertować do funkcji f szablonu takich jak to:
template <class T, class U>
bool f(T&& one, U&& two) { }
to mogę nazwać go lwartością odniesienia:
int x = 5;
f(x, 5);
Dlaczego tak jest? Dlaczego kompilator nie skarży się w tym przypadku?
Podczas gdy w przypadku "uniwersalnego odniesienia" występuje zwijanie odniesienia, prawdziwa magia dzieje się przed tym krokiem i występuje podczas dedukcji argumentu szablonu. Twoja notka o zwijaniu referencji nie działa w normalnej funkcji jest po prostu błędna; Zapadnięcie odniesienia może się zdarzyć wszędzie: 'using T = int &&; void foo (T & x); 'tutaj x jest' int & 'ze względu na zwijanie referencji – Simple
@ Prosty wygląda jak twoje prawo, już wiedziałem, że decltypes i auto mogą mieć zwijanie referencji, nie wiedziałem, że typedef może spowodować to, I Zmienię moją odpowiedź – aaronman