Zu 3.9.3:2
Alle cv-Qualifier, die auf einen Arraytyp angewendet werden, wirken sich auf den Arrayelementtyp und nicht auf den Arraytyp selbst aus (8.3.4).
und 8.3.4:1
Jeder Typ in der Form "cv-Qualifier-Sequenz Array von N T" wird zu "Array von N cv-Qualifier-Sequenz T" angepasst, und ähnlich für "Array mit unbekannter Größe von T".
Außerdem, gemäß 8.3.5:5
Nachdem der Typ jedes Parameters bestimmt wurde, wird jeder Parameter vom Typ "Array von T" oder "Funktion, die T zurückgibt" angepasst, um "Zeiger auf T" bzw. "Zeiger auf Funktion, die T zurückgibt" zu sein.
Das bedeutet, dass innerhalb einer Funktion, die einen Arrayparameter akzeptiert, der Parametertyp tatsächlich ein Zeiger ist, und aufgrund von 3.9.3:2 ist der Zeiger nicht cv-qualifiziert:
void foo(const int parameter[10]) {
parameter = nullptr; // das kompiliert!
}
Dies betrifft nicht den Typ der Funktion selbst, aufgrund einer anderen Klausel in 8.3.5:5
Nachdem die Liste der Parametertypen erstellt wurde, werden alle obersten cv-Qualifier, die einen Parametertyp modifizieren, beim Bilden des Funktionstyps gelöscht.
Deshalb, wenn Sie ein Array mit cv-Qualifiern übergeben möchten, muss es per Referenz erfolgen:
void foo(const int (¶meter)[10]);