?
facepalm schrieb:
Ein Zeiger kann nicht "kopierinitialisiert" werden, weil er keinen Kopierkonstruktor hat.
Der Begriff "copy-initialization," wie er im Standard in Absatz 8.5 (14) definiert wird, hat mit Konstruktoren nichts zu tun. Zeiger können sehr wohl kopierinitialisiert werden, und das auch mit Arrays. Zitat:
ISO/IEC 14882:2011 8.5 (14) schrieb:
The initialization that occurs in the form
T x = a;
as well as in argument passing, function return, throwing an exception (15.1), handling an exception (15.3), and aggregate member initialization (8.5.1) is called copy-initialization. [Note: Copy-initialization may invoke a move (12.8). -- end note]
facepalm schrieb:
Sone schrieb:
Wenn der Parameter eine Referenz ist, oder eine Klasse, die eine Referenz auf ein Array im Konvertierungskonstruktor nimmt, dann wird eben diese Referenz bzw. Klasse damit initialisiert.
Ach genau, wir rufen den Konstruktor der Array-Referenz mit einer Referenz zu einem Array auf.
Um in Sone-Sprech zu bleiben: Dann wird nicht das Array übergeben, sondern der Typ "Referenz auf Array".
Zum ersten Satz gilt im Grunde der gleiche Einwand. Initialisierung bedeutet nicht notwendigerweise den Aufruf eines Konstruktors, und eine Referenz kann (und muss) durchaus initialisiert werden.
Ich bin nicht sicher, was der zweite Satz bedeuten soll. Nackte Arraytypen können keine Funktionsparameter sein (Funktionen, die mit entsprechender Syntax deklariert werden, haben Zeigerparameter; siehe 13.1 (3)), von daher macht das Betrachten der Übergabe von Arrays an Funktionen überhaupt nur von der Aufrufseite her Sinn -- und Arrays, die an Funktionen übergeben werden, zerfallen nicht in allen Fällen zu Zeigern. nwp3 hatte am Anfang des Threads schonmal entsprechenden Code gepostet.
Wenn ein Array an eine Funktion übergeben wird, die einen passenden Zeiger erwartet, zerfällt es zu einem Zeiger. Wenn es an eine Funktion übergeben wird, die eine passende Array-Referenz erwartet, zerfällt es nicht. Das hat nur am Rande etwas mit dem Funktionsparameter zu tun; das selbe passiert, wenn man entsprechende lokale Variablen mit einem Array initialisiert.