Jeśli T
to typ, a następnie T*
oznacza typ "pointer-to- T
".
Typ void(int)
jest typem funkcja, to rodzaj funkcji przyjmujących jedną int
i powracający void
. Na przykład, jest to rodzaj f
jeśli f
jest zadeklarowana jako void f(int);
Jeśli T = void(int)
, następnie T*
jest napisane void(*)(int)
, więc ten ostatni jest rodzajem wskaźnika funkcji. Możesz także utworzyć odwołanie do funkcji, która jest T& = void(&)(int)
; czasami jest to bardziej przydatne (np. można podać adres funkcji l-wartość).
Poza Uwaga: Funkcja lwartościami próchnicy do swojego wskaźnika funkcji bardzo łatwo. Możesz wywołać funkcję za pomocą funkcji lwartości lub wskaźnika funkcji. Kiedy stosowany jako argumentu dla operatora zadnie (*
) wartość funkcji rozpada, więc można nieprawidłowego wskaźnika znowu i znowu:
printf("Hello world\n"); // OK
(*printf)("Hello world\n"); // also OK
(****printf)("Hello world\n"); // four-star programmer
Niektóre z niewielu razy, że funkcja nie rozpad jest stosowany jako operand z adresu operatora lub gdy zobowiązany do odniesienia:
void f(int); // our example function
void(*p1)(int) = &f; // no decay of "f" here
void(*p2)(int) = f; // "f" decays
void(&r1)(int) = f; // no decay of "f" here
void g(void(&callback)(int), int n) {
callback(n);
}
g(f, 10); // no decay of "f" here
template <typename F, typename ...Args>
decltype(auto) h(F&& callback, Args&&... args) {
return std::forward<F>(callback)(std::forward<Args>(args)...);
}
h(f, 10); // no decay of "f" here
[zwrotna funkcja: różnica między 'void (* func) (int)' i 'void (func) (int)'] (http://stackoverflow.com/q/25953542/995714) –
@ LưuVĩnhPhúc, jeśli uważasz, że jest to duplikat, powinieneś oznaczyć go jako taki – acupajoe
To nie jest duplikat. To pytanie dotyczy parametru funkcji zadeklarowanego za pomocą typu funkcji. – interjay