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

//C++ operatore predefinito di assegnazione

struct test { 
    int a[10]; 
}; 

test a,b; 
a = b; 

Primo codice non viene compilato, poiché smussiamo assegniamo matrice, ma il secondo fa. L'operatore di assegnazione di classe predefinito non chiama semplicemente l'assegnazione per ogni membro di dati? Perché compila il secondo codice?

+0

L'operatore di assegnazione classe predefinita copierà tutti gli elementi di un array. È come 'std :: array' funziona senza uno fornito dall'utente. – chris

+1

Perché è stata fatta un'eccezione speciale per gli array come membri. –

+0

Perché coinvolgere std :: array? Mi sto perdendo qualcosa? – Frodo

risposta

4

Dal progetto C++ 11, sezione 12.8:

L'operatore di assegnazione di copia/spostamento implicitamente definito per un non-union classe X esegue membro a membro assegnamento per copia/spostamento dei suoi oggetti secondari. Le classi di base dirette di X vengono assegnate per prime, nell'ordine della loro dichiarazione nell'elenco di specificatori di base, e quindi i membri di dati non statici immediati di X vengono assegnati, nell'ordine in cui sono stati dichiarati nella definizione di classe . Sia x il parametro della funzione o, per l'operatore di movimento, un xvalue riferito al parametro. Ogni suboject è assegnato nel modo appropriato al suo tipo:

- se il sottooggetto è di tipo classe, come se fosse una chiamata a operator = con il subobject come espressione dell'oggetto e il corrispondente subobject di x come singola funzione argomento (come se per qualificazione esplicita, cioè ignorando qualsiasi possibile funzione di override virtuale in più classi derivate);

- se il sottooggetto è una matrice, ogni elemento viene assegnato, nel modo appropriato al tipo di elemento;

- se il sottooggetto è di tipo scalare, viene utilizzato l'operatore di assegnazione incorporato.

La parte importante qui è: if the subobject is an array, each element is assigned, in the manner appropriate to the element type;