80 votes

Pourquoi std :: array n'a-t-il pas de constructeur qui prend une valeur pour que le tableau soit rempli?

C'est l'absence de

std::array<T,N>::array(const T& value);

un oubli? Il semble puissant utile pour moi, et de la dynamique des conteneurs (comme std::vector) ont un semblable constructeur.

Je suis pleinement conscient de

std::array<T,N>::fill(const T& value);

mais ce n'est pas un constructeur, et la mémoire sera remis à zéro en premier. Que faire si je veux que tous -1's comme ce gars?

54voto

Mike Seymour Points 130519

std::array est, de par sa conception, un agrégat; il n'y a donc aucun constructeur déclaré par l'utilisateur.

Comme vous le dites, vous pouvez utiliser fill après la construction par défaut. Puisqu'il s'agit d'un agrégat, la construction par défaut ne mettra pas à zéro la mémoire, mais la laissera non initialisée (si le type contenu est trivialement initialisable).

23voto

tohava Points 1760

Notez que vous pouvez simuler efficacement ce type de constructeur en tirant parti du fait que le tableau n'est pas initialisé à zéro et qu'il possède un constructeur de copie et le fait.

 template <size_t N, class T>
array<T,N> make_array(const T &v) {
    array<T,N> ret;
    ret.fill(v);
    return ret;
}

auto a = make_array<20>('z');
 

10voto

Nawaz Points 148870

Tout d'abord, ce n'est pas std::array<T> , c'est std::array<T,N>N est l'expression intégrale à constante de temps de compilation.

Deuxièmement, std::array est conçu comme un agrégat. Donc, il n'a rien qui le rende non agrégé, c'est pourquoi il n'a pas de constructeur ... et de destructeur, de fonctions virtuelles, etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X