22 votes

C++ vecteur de tableaux

Pourquoi ce travail:

std::pair<int, int> p = {1,2};
std::vector<std::pair<int, int>> vp = { {1,2}, {3,4} };

Mais cela ne veut pas?

std::array<int, 2> a = {1,2}; // still ok
std::vector<std::array<int, 2>> va = { {1,2}, {3,4} };

À l'aide de g++ 4.5.1 avec -std=c++0x, la deuxième ligne échoue avec:

erreur: impossible de convertir ‘{{1, 2}, {3, 4}}' de ‘std::vector<std::array<int, 2u> >'

Merci

20voto

JohannesD Points 4935

Malheureusement, std::array n'ont pas de liste d'initialiseur constructeur. En effet, il a pas défini par l'utilisateur constructeur que ce soit -- cette "fonctionnalité" est une survivance du C++03 où omettant tous définis par l'utilisateur constructeurs était la seule façon de permettre à la C-style corset d'initialisation. C'est à mon humble avis un défaut dans la norme actuelle.

Alors pourquoi ne pas intégré dans le corset de l'initialisation de travail dans ce cas? Voyons ce qu' std::array ressemble sous le capot:

template <typename T, int i> struct array {
    T data[i];
    // ...
}

Ok, donc ça ne voudrait pas dire que nous aurions du utiliser des doubles accolades dans l'initialiseur (une paire pour array, une autre paire pour l' data membre?

std::array<int, 2> a = { {1, 2} };

C (et, par conséquent, C++) a une règle spéciale sur corset élision, permettant à l'omission de l'intérieur des accolades sauf si il y a une ambiguïté. array exploiter cette fonctionnalité, ce qui nous permet d'écrire

std::array<int, 2> a = { 1, 2 };

Alors pourquoi ne pas l'exemple dans le post original de travail? Car corset élision n'est autorisé que dans le cadre d'un C-style globale de l'initialisation, pas si il y a quelque chose de plus compliqué acteurs, de type définies par l'utilisateur la liste des initialiseurs constructeur.

Les éléments suivants doivent travailler, bien que, le plus laid qu'il est:

std::vector<std::array<int, 2>> vp = { {{1,2}}, {{3,4}} };

Le fait qu'il n'a pas, au moins sur gcc et gcc 4.5 4.6, me semble indiquer un bug du compilateur. Je ne suis pas complètement sûr à ce sujet, cependant.

Cette question est peu pertinente: Comment initialiser un membre de tableau avec un initializer_list?

4voto

TonyK Points 8604

Ceci fonctionne:

std::vector<std::array<int, 2>> va = {
  std::array<int, 2>{1,2},
  std::array<int, 2>{3,4}
};

Creuser plus profond, il semble que std::pair a un constructeur qui prend un initialiser la liste, mais std::array n'est pas:

std::pair<int, int> p ({1,2}) ;  // OK
std::array<int, 2> a ({1,2}) ;   // Invalid

Mais maintenant je suis hors de ma profondeur.

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