J'ai récemment rencontré un problème étrange : j'obtenais un const_iterator
au lieu de la valeur attendue iterator
lors de l'itération dans un multi-ensemble. Il s'est avéré que ce n'était pas un problème pour MSVC, mais que g++ m'a donné une erreur :
erreur : initialisation invalide de la référence de type 'myPtr&' à partir d'une expression de type 'const boost::shared_ptr'
Code correspondant :
typedef std::multiset<myPtr> myList;
myList _mystuff;
void tick(float dt)
{
for (myList::iterator i = _mystuff.begin(); i != _mystuff.end(); ++i)
{
myPtr &mine = *i; // g++ problem here, not for MSVC
// const myPtr &mine = *i; works fine for g++
mine->tick(dt);
}
}
De nombreuses recherches ont révélé qu'il s'agissait d'un problème lié à de nombreuses discussions antérieures. J'ai trouvé ces passages pertinents :
- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=14990
- http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#322
- http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#103
- http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#279
- http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#528
Mes connaissances et ma compréhension de la question sont limitées et j'aimerais donc savoir si la norme ne définit pas suffisamment bien ce comportement, auquel cas g++ et MSVC l'implémentent à leur guise, ou si g++ ou MSVC s'écartent d'une norme bien définie.
Merci d'avance.