Staram się zrozumieć, co dokładnie dzieje się podczas przekazywania referencji do funkcji funkcji jako uniwersalnej referencji (jaki typ jest wydedukowywany). Załóżmy, że mamy foo funkcję, która pobiera param jako uniwersalnego odniesienia:Przekazywanie odwołania do funkcji jako uniwersalnego odniesienia
template<typename T>
void foo(T&& param)
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
A potem zróbmy następujące:
void(&f)(int) = someFunction;
foo(f);
Rezultatem będzie:
void foo(T&&) [with T = void (&)int]
Jest to całkowicie zrozumiałe: przechodzimy do l-wartości naszej funkcji foo, więc wyprowadzony typ jest nieważny (&) int, a typem parametru będzie "void (& & &) int", który w ramach odwołania do reguł zwijania stanie się nieważny (&) int. Param będzie tylko lwartym odniesieniem do funkcji.
Ale kiedy należy wykonać następujące czynności:
void(&f)(int) = someFunction;
foo(std::move(f));
foo wypisze:
void foo(T&&) [with T = void (&)int]
która jest dokładnie taka sama jak poprzednio! Co tu się dzieje? Dlaczego wynik jest taki sam jak przy przejściu do lwartości? Spodziewalibyśmy się, że skoro przechodzimy rvalue do foo, to dedukowany typ powinien być T = void (int), a parametr powinien zostać unieważniony (& &) int. Dzieje się tak zawsze w przypadku wszystkich innych "normalnych" typów (takich jak klasy, typy pierwotne itd.). Dlaczego jest inaczej w przypadku odniesień do funkcji?
Nah. 'param' ma nazwę, z definicji jest l-wartością. –
@KerrekSB Przepraszamy, ale to źle - http: // stackoverflow.com/questions/7016777/what-is-an-rvalue-reference-to-function-type –
@rubix_addict: Mój zły, dzięki! Oddalony. Byłem po oświadczeniu, które jest częścią odpowiedzi, ale nie zrozumiałem tego. –