2012-12-20 4 views
11
class A 
{ 
public: 
    A(){} 

private: 
    int i; 
}; 

A a[8]; 

Il C++ 11 norma 8.5.1.1 dice:Un array di qualsiasi tipo è sempre un aggregato?

"Un aggregato è una matrice o una classe (Clausola 9) senza costruttori forniti dall'utente (12.1), senza bretelle-o-equalinitializers per membri di dati non statici (9.2), nessun membro di dati non statici privato o protetto (clausola 11), nessuna classe di base (clausola 10) e nessuna funzione virtuale (10.3). "

Come un array, è un aggregato? Penso di no, ma lo standard dice di sì.

+11

Se lo standard lo dice, lo standard vince :) – Gorpik

+1

@Gorpik Tutti salutano l'hip-standard! : D –

risposta

14

Sì, A[8] è un tipo aggregato, anche se non lo è A.

La nozione di aggregato non è transitiva, diversamente da altre nozioni correlate (come "banalmente copiabile").

In senso lato, un aggregato influisce solo sull'inizializzazione del tipo e quindi non ha bisogno di essere transitivo. Puoi dire A a[2] = { A('x', true), A(1, 2, 3) }; senza dover porre restrizioni sulla natura di A. Al contrario, nozioni come la banale riproducibilità si riferiscono al layout di memoria di una classe e quindi, per la loro stessa natura, devono essere transitive.

+0

@BenVoigt: vero. L'ho controllato. Mi sbagliavo. – Nawaz