Nie mogę tego rozgryźć:
int main() {
int (*) (int *) = 5;
return 0;
}
Powyższe przypisanie kompiluje się z g ++ c ++ 11. Wiem, że int (*) (int *)
jest to wskaźnik do funkcji, która przyjmuje (int *)
argument jako argument i zwraca wartość int, ale nie rozumiem, jak można to zrównać do 5. Na początku myślałem, że jest to funkcja, która stale zwraca 5 (z mojej ostatniej nauki w F #, prawdopodobnie haha), wtedy pomyślałem krótko, że wskaźnik funkcji wskazuje na lokalizację pamięci 5, ale to oczywiście nie działa, podobnie jak wartości szesnastkowe.
Myśląc, że może to być spowodowane tym, że funkcja zwraca int, a przypisanie int jest w porządku (w jakiś sposób), spróbowałem też tego:
int * (*) (int *) = my_ptr
gdzie my_ptr
jest typu int *
, tego samego typu co ten drugi wskaźnik funkcji, tak jak w pierwszym przypadku typu int. To się nie kompiluje. Przypisanie 5 lub dowolnej wartości int zamiast tego my_ptr
również nie jest kompilowane dla tego wskaźnika funkcji.
Więc co oznacza to zadanie?
Zaktualizuj 1
Mamy potwierdzenie, że jest to błąd, jak pokazano w najlepszej odpowiedzi. Jednak nadal nie wiadomo, co tak naprawdę dzieje się z wartością przypisaną do wskaźnika funkcji lub co dzieje się z przypisaniem. Wszelkie (dobre) wyjaśnienia na ten temat będą bardzo mile widziane! Zapoznaj się z poniższymi zmianami, aby uzyskać więcej informacji na temat problemu.
Edytuj 1
Używam gcc w wersji 4.8.2 (w Ubuntu 4.8.2)
Edytuj 2
Właściwie zrównanie tego z czymkolwiek działa na moim kompilatorze. Nawet zrównanie go ze zmienną std :: string lub nazwą funkcji, która zwraca wartość double, działa.
Edytuj 2.1
Co ciekawe, uczynienie go wskaźnikiem funkcji do dowolnej funkcji, która zwraca typ danych, który nie jest wskaźnikiem, pozwoli na kompilację, na przykład
std::string (*) () = 5.6;
Ale gdy tylko wskaźnik funkcji znajdzie się na funkcji, która zwraca jakiś wskaźnik, nie kompiluje się, na przykład with
some_data_type ** (*) () = any_value;