Dlaczego uważasz, że nie do przyjęcia. Można deklarować funkcję wewnątrz ciała innej.
Przeładowanie = przeciążanie ;-P
dwie pierwsze to zamierzone deklaracje, a kolejna (ta ze static_cast) to zamierzone wywołanie to oczywiście wywoła się funkcja int foo(float x), gdyż tylko ona pasuje do wywołania (liczba argumentów).
Nawet zrozumiałem już pytanie :-D Dzięki.
Wszystkie wywołania są ok (a,b,c).
fun(a), gdyż a, które jest typu int zostanie niejawnie rzutowane do float i zostanie wywołana funkcja int foo(float x).
fun(b,a), gdyż b i a, zostaną rzutowane niejawnie odpowiednio na int i float. Wiem, że trochę dziwna może się wydawać promocja (tylko w drugą stronę) float -> int w przypadku b, ale w C++ tak właśnie będzie.
Trzecie wywołanie jest oczywiste, bo jawnie jest rzutowanie i wywołanie działa po prostu (idealne dopasowanie). Sorry, za pierwszego, trochę mylącego posta.
o czlowieku... nawet jak masz gdzies funkcje fun to ci sie nie skompiluje bo ze wywolujesz fun().
int fun (float x);
void fun (int x, float y);
To nie jest wywołanie. To jest deklaracja. Nie kompiluje się bo właśnie nie ma funkcji int fun(float x) i void fun(int x, float y); nigdzie.
Wystarczy dodać taki kod:
int fun (float) {
return 1;
}
void fun(int,float) {
}
i będzie się już kompilowało. Oczywiście te definicje w zasięgu globalnym