Inizializzazione predefinita è un termine dello Standard che potenzialmente significa nessuna inizializzazione, quindi probabilmente intendi zero inizializzazione .
La descrizione su cppreference.com è in realtà un po 'fuorviante. std::array
è una classe aggregata, e se il tipo di elemento è primitivo, è POD: "plain old data", con semantica che corrisponde strettamente al linguaggio C. Il costruttore implicitamente definito di std::array< int, N >
è banale che non fa assolutamente nulla.
La sintassi simile std::array< int, 3 >()
o std::array< int, 3 > x{}
che fornisce valori azzerati non lo fa invocando un costruttore. Ottenere zeri fa parte dell'inizializzazione del valore , specificata in C ++ 11 §8.5 / 8:
Inizializzare un valore di un oggetto di tipo T significa:
- se T è un tipo di classe (possibilmente qualificato da cv) senza un costruttore predefinito fornito dall'utente o cancellato, l'oggetto è inizializzato zero ... e se T ha un costruttore predefinito non banale, l'oggetto è inizializzato per impostazione predefinita;
std::array
non ha un costruttore predefinito fornito dall'utente, quindi viene inizializzato a zero. Ha un costruttore predefinito definito in modo implicito, ma è banale, quindi non viene mai inizializzato per impostazione predefinita. (Ma questo non fa differenza poiché l'inizializzazione banale per definizione non ha effetto in fase di esecuzione.)
in caso contrario, esiste una sintassi che funzionerà su tutti gli array (inclusi gli array di dimensioni zero) per inizializzare tutti gli elementi al loro valore predefinito?
Gli array in stile C std::array
sono entrambi aggregati e il modo per inizializzare completamente a zero qualsiasi aggregato è con la sintassi = {}
. Funziona da C ++ 98. Notare che gli array in stile C non possono avere estensione zero e questo sizeof (std::array< X, 0 >)
non è zero.
T x[N]
sintassi.