7
int a[10]; 
int b[10]; 
a = b; 

//C++ Standardzuweisungsoperator

struct test { 
    int a[10]; 
}; 

test a,b; 
a = b; 

erste Code nicht kompilieren lässt, da wir Array zuweisen kann nicht, aber der zweite Fall ist. Ist der Standard-Zuweisungsoperator der Klasse nicht einfach eine Zuweisung für jedes Datenelement? Warum kompiliert der zweite Code?

+0

Die Standardklasse Zuweisungsoperator alle Elemente eines Arrays kopiert. So funktioniert 'std :: array' ohne einen vom Benutzer bereitgestellten. – chris

+1

Weil eine spezielle Ausnahme für Arrays als Mitglieder gemacht wurde. –

+0

Warum std :: array? Fehle ich etwas? – Frodo

Antwort

4

Aus dem C++ 11 Entwurf, Abschnitt 12.8:

Der implizit definierte Kopieren/Verschieben Zuweisungsoperator für eine nicht gewerkschaftlich Klasse X führt element Kopieren/Verschieben Abtretung seiner Subobjekte. Die direkten Basisklassen von X werden zuerst in der Reihenfolge ihrer Deklaration in der Basisspezifiziererliste zugewiesen, und dann werden die unmittelbaren nicht statischen Datenelemente von X in der Reihenfolge zugewiesen, in der sie in der Klassendefinition deklariert wurden . Sei x entweder der Parameter der Funktion oder für den move-Operator ein x-Wert, der sich auf den Parameter bezieht. Jedes Unterobjekt wird seinem Typ entsprechend zugewiesen:

- wenn das Unterobjekt vom Klassentyp ist, wie durch Aufruf von operator = mit dem Unterobjekt als Objektausdruck und dem zugehörigen Unterobjekt von x als Einzelfunktion Argument (als ob durch explizite Qualifizierung; das heißt, ignorieren aller möglichen virtuellen überschreibenden Funktionen in mehr abgeleiteten Klassen);

- Wenn das Unterobjekt ein Array ist, wird jedes Element entsprechend dem Elementtyp zugewiesen;

- Wenn das Unterobjekt vom Skalartyp ist, wird der integrierte Zuweisungsoperator verwendet.

Der wichtige Teil ist hier: if the subobject is an array, each element is assigned, in the manner appropriate to the element type;