Funkcja zwraca się odniesienie do tablicy int
wielkości 3
i [3]
część po funkcji właściwie rozmiar tablicy być zwrócony w odniesieniu.
Ta składnia niejasne pochodzi z dziwnej składni deklaracji tablicy, co robisz, jak:
int arr[3]; //real but weird
Językiem byłoby znacznie prostsze, gdyby miało to zamiast:
int[3] arr; //hypothetical but better and simpler
ponieważ rozmiar 3
to część typu arr
, więc ma sens, jeśli wszystkie części pojawiają się po lewej stronie nazwy zmiennej, w taki sam sposób jak przy pisaniu:
unsigned int a;
You dont napisać:
unsigned a int; //analogous to : int a [3];
Więc podczas gdy język robi słusznie z unsigned int
, robi się bardzo dziwne rzeczy z int[3]
.
Teraz wracając do deklaracji funkcji, funkcja byłoby znacznie lepiej, gdyby została zadeklarowana jako:
int[3]& f(int[3]& arr); //hypothetical
tylko gdyby wszystkie części po lewej stronie nazwy zmiennej. Ale ponieważ nie robi (tzn języku wymaga pisanie rozmiar na skrajnej prawej stronie po nazwie zmiennej), skończyć z tym dziwnym Podpis:
int (&f(int (&arr)[3])[3]; //real
Zauważ, że jak nawet parametr staje się dziwny.
Ale można uprościć go typedef jak:
typedef int array_type[3];
array_type& f(array_type& arr);
który wygląda znacznie lepiej. Teraz tylko typ typedef wygląda dziwnie.
z C++ 11, można napisać nawet lepsze typedef:
using array_type = int[3];
array_type& f(array_type& arr);
który jest tak blisko, jak to (jeśli wizualizować array_type
jak int[3]
):
int[3]& f(int[3]& arr); //hypothetical
nadzieję, że pomoże .
Ponieważ K & R są sadystów . – orlp
http://cdecl.org/. Składnia C deklaratora może być "zabawna". –
Kiedy już to zrobisz, nigdy nie pisz tak okropnej rzeczy w prawdziwym kodzie. – kebs