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}}’
à‘std::vector<std::array<int, 2u> >’
Grâce
- pouvez-vous préciser "échec"? (comme donner à votre compilateur de l'erreur?)
- Quel système d'exploitation? Peut-être un bug du compilateur
- plus de détails ajoutés, merci!
- Je suis en train de me douter que gcc 4.5.1 n'est pas entièrement conforme sur ce point. Malheureusement, je ne sais pas en ligne compilateur qui pourrait aider ici (ideone utilise 4.5.1).
Vous devez vous connecter pour publier un commentaire.
Malheureusement,
std::array
ne dispose pas d'une liste d'initialiseur constructeur. En effet, il a pas définis 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 que
std::array
ressemble sous le capot:Ok, donc ça ne voudrait pas dire que nous aurions du utiliser double accolades dans l'initialiseur (une paire pour
array
, une autre paire pour ladata
membre?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'écrireAlors 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.
Suivantes devrait travail, même si, le plus laid qu'il est:
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?
std::array
ressemble plus àtemplate <typename T, std::size_t i>
T t = { ... }
déclaration. C'est aussi pourquoireturn { ... }
ne fonctionnera pas avec unstd::array<>
type de retour.Cela fonctionne:
Creuser plus profond, il semble que std::pair a un constructeur qui prend un initialiser la liste, mais std::array n'est pas le cas:
Mais maintenant je suis hors de ma profondeur.