Das allgemeine Problem ist, dass in C++ Deklarationssyntax, Array-Typen in Funktionsparameter Deklarationen etwas nicht-intuitive bedeuten: ein Parameter als T[]
deklariert oder als T[10]
oder als T[1279]
tatsächlich deklariert als T*
– alle diese Parameter Erklärungen identisch sind. *
Denken Sie daran, dass in C++ keine Prvalues des Array-Typs vorhanden sind und Array-Typen daher keine Funktionsparameter oder Rückgabetypen sein können. (Bei Verwendung als prvalue verwendet, ein Array abklingt auf einen Zeiger auf das erste Element.)
Daher Funktionsdeklaration tatsächlich ist (mit T = const int
):
void print(const int *);
Dieser Parametertyp spielt gut mit das Verkleinern von Array zu Pointer, aber jetzt ist klar, dass Sie beliebige Zeiger auf int
zu dieser Funktion übergeben können, und die Richtigkeit der Funktionsausführung kann nicht aus der Funktionsdefinition allein bestimmt werden.
*) Es ist ein wenig more complicated in C99.
Auf einer Seite beachten, Array glvalues sind völlig in Ordnung, wie die folgende Funktion ist, die einen Parameter aufweist, deren Typ "Bezug auf Array":
void print10(const int (&a)[10])
{
for (auto i : a) { std::cout << i << "\n"; }
}
Es ist keine sehr nützliche Funktion. Es kann nur ein Array von genau 10 Elementen drucken. Wenn Sie ein Array mit weniger als 10 Elementen bereitstellen, wird es unterbrochen. –
@NeilKirk: Was ist, wenn Sie ein Array mit mehr als 10 Elementen bereitstellen? –
Ich kenne die magischen Zahlen schon. noch etwas? – pezy