2017-11-20 6 views
0

Ich bin verwirrt, warum der Zuweisungsausdruck in f kompiliert, aber in g nicht kompiliert. Ich erwarte, dass beide Aufgaben fehlschlagen, da der Array-Typ nicht modifizierbar ist.C++ Array als Funktionsparameter

Jede Bezugnahme auf C++ - Standard wird geschätzt.

+1

Mögliches Duplikat von [Wenn eine Funktion einen Array-Parameter bestimmter Größe hat, warum wird sie durch einen Zeiger ersetzt?] (Https://stackoverflow.com/questions/1328223/when-a-function-hasa-a- specific-size-array-parameter-why-is-it-replaced-with-ap) – VTT

+0

Verwenden Sie stattdessen lieber 'std :: array' oder' std :: vector'. –

Antwort

2

Dies hat alles mit Funktionsparametertyp Einstellung zu tun ([dcl.fct]/5):

Nachdem die Art jedes Parameters Bestimmen beliebiger Parameter des Typs „array of T“ oder von Funktionstyp T wird so eingestellt, sei "Zeiger auf T".

Da eine Art Alias ​​für die es Namen Typen äquivalent ist, im ersten Fall wird der Typ als char[10] ermittelt und an char* eingestellt. Sie können einen Zeiger ändern. Im zweiten Fall bilden Sie eine char(&)[10]. Es ist ein Verweis auf ein Array, und Arrays können nicht zugewiesen werden, auch nicht über eine Referenz.

+0

Also der Standard unterscheidet sich zwischen Typ ist "Array von T" und Typ ist "Verweis auf Array von T", ich könnte nur akzeptieren, dass, obwohl es mir komisch scheint ... – xdot

+0

@xdot - Dieser Array-Typ von C gezogen * sind * komisch. Ich stimme dem Kommentar zu deinem Beitrag zu. 'std :: array' ist besser für solche Dinge. Es ist ein tatsächlicher Werttyp. – StoryTeller

Verwandte Themen