La funzione restituisce un riferimento a una matrice di int
di dimensioni 3
e la parte [3]
dopo la funzione effettivamente la dimensione della matrice da restituire come riferimento.
Questa sintassi oscura deriva dalla strana sintassi della dichiarazione di matrice, che si fa come:
int arr[3]; //real but weird
Il linguaggio sarebbe stato molto più semplice se avesse questo, invece:
int[3] arr; //hypothetical but better and simpler
perché la dimensione 3
è parte del tipo di arr
, quindi ha molto più senso se tutte le parti compaiono sul lato sinistro del nome della variabile, nello stesso modo in cui scrivete:
unsigned int a;
È Dont write:
unsigned a int; //analogous to : int a [3];
Così, mentre la lingua fa la cosa giusta con unsigned int
, fa una cosa molto strana con int[3]
.
Ora tornando alla dichiarazione di funzione, la funzione sarebbe stato molto meglio se viene dichiarata come:
int[3]& f(int[3]& arr); //hypothetical
solo se aveva tutte le parti sul lato sinistro del nome-variabile. Ma dal momento che non lo fa (cioè il linguaggio richiede di scrivere le dimensioni sul lato più a destra dopo il nome della variabile), si finisce con questa firma strano:
int (&f(int (&arr)[3])[3]; //real
Si noti che come anche il parametro diventa strano
Ma è possibile semplificare con un typedef come:
typedef int array_type[3];
array_type& f(array_type& arr);
Che sembra molto meglio. Ora solo il typedef sembra strano.
Con C++ 11, è possibile scrivere anche un typedef meglio:
using array_type = int[3];
array_type& f(array_type& arr);
che è il più vicino questo (se si visualizza array_type
come int[3]
):
int[3]& f(int[3]& arr); //hypothetical
Speranza che aiuta .
Perché K & R sono sadici . – orlp
http://cdecl.org/. La sintassi del dichiaratore C può essere "divertente". –
Una volta ottenuto, per favore non scrivere mai una cosa così orribile in un codice di vita reale. – kebs