Die Funktion kehrt eine Referenz auf ein Array von int
der Größe 3
und den [3]
Teil nach der Funktion tatsächlich die Größe des Arrays als Referenz zurückgeführt werden.
Diese obskure Syntax stammt aus der seltsamen Syntax der Array-Deklaration, die Sie tun, wie:
int arr[3]; //real but weird
Die Sprache viel einfacher gewesen wäre, wenn es diese Stelle hat:
int[3] arr; //hypothetical but better and simpler
weil Größe 3
ist Teil vom Typ arr
, es macht also viel mehr Sinn, wenn alle Teile auf der linken Seite des Variablennamens erscheinen, genau wie beim Schreiben:
unsigned int a;
Sie nicht schreiben:
unsigned a int; //analogous to : int a [3];
Während also die Sprache mit unsigned int
das Richtige tut, tut es eine sehr seltsame Sache mit int[3]
.
Nun zurück zur Funktionsdeklaration kommen, wäre die Funktion viel besser gewesen, wenn es so erklärt:
int[3]& f(int[3]& arr); //hypothetical
nur, wenn es auf der linken Seite des Variablennamen alle Teile hatte. Aber da es das nicht tun (dh der Sprache erfordert Sie die Größe auf der äußersten rechten Seite nach dem Variablennamen schreiben), können Sie mit dieser seltsamen Signatur am Ende:
int (&f(int (&arr)[3])[3]; //real
Beachten Sie, dass, wie auch die Parameter wird seltsam.
Aber Sie es mit einem typedef wie vereinfachen kann:
typedef int array_type[3];
array_type& f(array_type& arr);
so viel besser aussieht. Jetzt sieht nur die typedef seltsam aus.
Mit C++ 11, können Sie sogar eine bessere typedef schreiben:
using array_type = int[3];
array_type& f(array_type& arr);
, die als diese so nah ist (wenn Sie array_type
als int[3]
visualisieren):
int[3]& f(int[3]& arr); //hypothetical
Hoffnung, die hilft .
Da K & R Sadisten sind . – orlp
http://cdecl.org/. C-Deklaratorsyntax kann "Spaß" sein. –
Sobald Sie es bekommen, schreiben Sie nie so schreckliche Sache in einem echten Code. – kebs