Niepoprawne deklaracje funkcji (?)

0

Witam, mam problem. Mam stwierdzić, które deklaracje funkcji są dobre, a które nie. mam problem z tymi "bardziej zagmatwanymi"

1 int fun(double, int );

2 void fun(double, unsigned int);

3 void fun(double, ... );

4 template<class x>
int fun( list<x>& );

5 template<int x>
int fun(int, double[x] );

6 template<class x>
int fun(x, x(*)(x*) );
 

komilator wywala się przy 4:
http://wklej.org/id/931852/?hl=

pierwsza, wygląda elegancko, druga tak samo.
W trzeciej co oznaczają kropeczki? Mozliwość dodania nieskończonej ilości innych nieobowiązkowych argumentów?

Ad. 4 dostaje referencje, ale na co? o.O

Ad. 5 czy double [x] jest poprawne? tzn czy możemy dac funkcji tablice z typem miedzy nawiasami?

Ad. 6
nie rozumiem co to x()(x) dlaczego argument ma dwa nawiasy okragle? co znaczy () ? i dlaczego mamy (x) bez czegos kolejnego np (x* jakies_cos) ?

1

Ad3. tak
Ad4. referencja na wzorzec list
Ad5. Jest poprawne tylko że to nic nie wnosi, czyli skompiluje się ale bez sensu.
Ad6. wskaźnik na funkcje zwracającą typ x oraz przyjmującą wskaźnik na x jako jedyny parametr.

1

W 4 chodzi o klasę pochodzącą z biblioteki standardowej.

Co do 5 to takie coś jest rzeczywiście bez sensu (ale mimo to się skompiluje i jest poprawne), bo tablica i tak jest przekazywana za pomocą wskaźnika i informacja o jej rozmiarze zostanie utracona - z tego powodu dedukcja parametrów szablonu się nie powiedzie. Co innego jednak, jeżeli przekazujemy tę tablicę przez referencję. Wtedy takie coś zadziała:

template <typename T, size_t N>
void magic(const T (&t)[N])

http://ideone.com/owMQuJ

Ostatni przykład dobitnie pokazuje, że pomijanie nazw argumentów w deklaracjach funkcji jest niemiłe. x (*cokolwiek)(x *param) jest dużo prościej przeczytać: "cokolwiek jest wskaźnikiem na funkcję przyjmującą argument typu wskaźnik na x oraz zwracającą x".

0

woah. Dziekuje. Czyli 4 jest okej, a 5 dupka.
najbardziej mnie wystraszylo to, o czym mowil Endrju ^^

1 użytkowników online, w tym zalogowanych: 0, gości: 1