int v[1];
auto p1 = v;
auto &p2 = v;
auto *p3 = v;
p1
ist vom Typ int *
(gleich für p3
). Insbesondere bei dieser trivialen Probe finde ich p2
(int (&)[1]
) nützlicher, da es Array-Semantik, z. Ich kann sizeof
auf p2
anwenden, um dasselbe wie sizeof
auf v
zu geben.Warum Typ-Abzug für Arrays priorisiert Zeiger auf den ersten Bezug auf Array?
Gibt es dafür ein Standardangebot?
Warum ist das Verwerfen von Referenzen eine schlechte Idee? (Für diesen Array-Fall meine ich, fast kein C++ - Programmierer interessiert sich heutzutage für sie ...)
'Gibt es dafür ein Standardzitat?' 7.1.6.4/7 gibt an, dass die Regeln für den Typabzug mit 'auto' gleich sind (modulo' initializer_list') wie die Regeln für die Ableitung von Templateargumenten. 14.8.2.1/2 (für die Ableitung von Vorlagenargumenten) gibt dann an, dass der Abfall vom Array-Typ zum Zeigertyp nur für Nicht-Referenzparameter auftritt. –
Es könnte auch interessant sein zu bemerken, dass das Gleiche für Funktionstypen gilt. Wenn Sie die Definition von 'v' in' void v() 'ändern, dann ist' p1' 'void (*)()', aber 'p2' ist' void (&)() ' – Praetorian
C hat keine Referenzen , daher zerfallen Arrays in Zeiger, wenn sie als Funktionsargumente übergeben werden. C++ hat das Verhalten von C aus Gründen der Kompatibilität geerbt. – Casey