Mais pourquoi y a-t-il une raison pour laquelle std :: Array code> in C ++ 11 est une classe utile qui fournit une interface de conteneur C ++ sur un tableau de pile C +. P>
std :: Array Code> ne dispose pas du constructeur de remplissage typique que la plupart des conteneurs ont? Au lieu de cela, il a une méthode
remplissage code>. P>
std :: tableau code> est unique parmi les conteneurs stl à cet égard? P>
3 Réponses :
oui; STD :: Array Code> est censé être un agrégat (C ++ 11 §8.5.1) de sorte qu'à peut être utilisé autant de contextes que possible dans lequel un tableau uni peut être utilisé. Un agrégat ne peut avoir aucun constructeur ou destructeur explicite. P>
à partir de l'article 23.3.2.1: P>
Un tableau est un agrégat (8.5.1) pouvant être initialisé avec la syntaxe array a = {initialisateur-liste}; p> blockQuote>
Si cela fonctionnait comme
std :: vecteur code> ce ne serait plus un pod. De plus, à partir de la même section: P>
Les conditions d'un agrégat (8.5.1) doivent être remplies. P> blockQuote>
Ces conditions sont: p>
Un agrégat est un tableau ou une classe (clause 9) sans constructeurs fournis par l'utilisateur (12.1), pas de corset-ou-Égalisé Pour les éléments de données non statiques (9.2), aucun membre de données non statiques privé ou protégé (clause 11), Pas de classes de base (clause 10) et aucune fonction virtuelle (10.3). P> blockQuote>
Tout le monde a expliqué le "pourquoi" assez bien que je pense, je vais donc simplement mettre en place une suggestion de contournement, qui devrait compiler pour être aussi bonne qu'un constructeur natif:
template< typename T, std::size_t n > std::array<T,n> filledArray( const T& v ) { std::array<T,n> r; r.fill( v ); return r; } auto arr = filledArray<int,4>( 7 );
HM, une raison de ne pas utiliser de boucle de plage? Juste curieux.
Ou la fonction remplir code> Membre?
Aussi @zeta, seulement parce que je continue à oublier qu'il existe. Changé pour utiliser remplir code> car il a plus de sens et est plus susceptible d'avoir des optimisations.
@Dave: Complètement oublié remplissage () code> lors de la discussion sur les pods et les agrégats, DOH.
Parce que STD :: Array ne serait plus un pod.
Je pensais que c ++ 11 s'est détendu la définition de la cosse
@ Channel72: POD: "Une structure de POD est une classe non-syndicale qui est à la fois une classe triviale B> et une classe de mise en page standard [...]" i>. Classe triviale: "Une classe triviale est une classe qui possède un constructeur par défaut (12.1), n'a pas de constructeurs par défaut non triviaux b> et est de manière triviale." I> Toutefois, I> Code> STD :: Array Code> est un agrégat, et il faut suivre des règles similaires (voir la réponse de Borgleader).