11
votes

Décision de conception concernant STD :: Remplissage du tableau

std :: Array in C ++ 11 est une classe utile qui fournit une interface de conteneur C ++ sur un tableau de pile C +.

Mais pourquoi std :: Array ne dispose pas du constructeur de remplissage typique que la plupart des conteneurs ont? Au lieu de cela, il a une méthode remplissage .

y a-t-il une raison pour laquelle std :: tableau est unique parmi les conteneurs stl à cet égard?


3 commentaires

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 et une classe de mise en page standard [...]" . 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 et est de manière triviale." Toutefois, Code> STD :: Array est un agrégat, et il faut suivre des règles similaires (voir la réponse de Borgleader).


3 Réponses :


5
votes

oui; STD :: Array 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.


0 commentaires

6
votes

à partir de l'article 23.3.2.1:

Un tableau est un agrégat (8.5.1) pouvant être initialisé avec la syntaxe array a = {initialisateur-liste};

Si cela fonctionnait comme std :: vecteur ce ne serait plus un pod. De plus, à partir de la même section:

Les conditions d'un agrégat (8.5.1) doivent être remplies.

Ces conditions sont:

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).


0 commentaires

3
votes

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 );


4 commentaires

HM, une raison de ne pas utiliser de boucle de plage? Juste curieux.


Ou la fonction remplir Membre?


Aussi @zeta, seulement parce que je continue à oublier qu'il existe. Changé pour utiliser remplir car il a plus de sens et est plus susceptible d'avoir des optimisations.


@Dave: Complètement oublié remplissage () lors de la discussion sur les pods et les agrégats, DOH.