Bonsoir à tous,
Je suis victime d'un problème dont j'ai étrangement de la peine à comprendre la cause.
Imaginons que je veuille construire un std::vector
avec un intervalle d'éléments donné par deux itérateurs, sous la forme :
template<class InputIt> std::vector(InputIt first, InputIt last)
.
Le code suivant, par exemple, fonctionnera parfaitement :
1 2 | std::string s = "abcd"; std::vector<char> v(s.cbegin(), s.cend()); |
En revanche, utiliser des std::istream_iterator
semble poser problème, et pour une raison que je ne saisis pas. Prenons ce code :
1 2 3 4 5 | template<class T> using isIt = std::istream_iterator<T>; // ... std::istringstream flux("12 35 276 375 34"); std::vector<int> v(isIt<int>(flux), isIt<int>()); |
Aucun problème à la compilation. Cependant, l'objet v
de type std::vector
ne semble pas avoir été créé. Il suffit d'appeler une de ses fonctions membres pour obtenir une erreur du type :
1 | error: request for member 'size' in 'v', which is of non-class type 'std::vector<int>(isIt<int>, isIt<int> (*)()) |
Donc visiblement, je n'ai pas construit un std::vector
, mais quelque chose d'autre, et malgré le message d'erreur et mes diverses recherches sur Internet, je n'ai pas pu comprendre ce que c'est réellement.
J'ai d'ailleurs remarqué que l'utilisation des accolades au lieu des parenthèses appelait correctement le constructeur et ne causait ainsi pas de problème. De même, initialiser le vecteur avec assign
fonctionne parfaitement.
1 2 | std::vector<int> v{ isIt<int>(flux), isIt<int>() }; // fonctionne v.assign(isIt<int>(flux), isIt<int>()); // fonctionne également |
Je vous demande ainsi : quel peu bien être cet objet créé qui n'est pas un std::vector
? Et quel en est la cause d'un tel comportement ?
Merci d'avance pour vos réponses.