Ich lief vor kurzem in einem seltsamen Problem, wo ich eine const_iterator
statt der erwarteten iterator
beim Iterieren durch ein Multiset bekommen würde. Es stellte sich heraus, ein Nicht-Thema für MSVC sein, aber g ++ mir ein Fehler gab:C++ Standard: Unerwarteter const_iterator in Multiset
error: invalid initialization of reference of type 'myPtr&' from expression of type 'const boost::shared_ptr'
Relevante Code:
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);
}
}
Ganz ein wenig Forschung ergab, dass ein Problem mit vielen vorherigen Diskussion . Ich fand diese relevanten Bits:
- 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
Mein Wissen Hintergrund und greifen auf die Frage beschränkt ist und so würde ich möchte wissen, ob der Standard dies nicht definiert Verhalten gut genug, in diesem Fall implementieren g ++ und MSVC das Verhalten nach ihren Wünschen oder ob entweder g ++ oder MSVC von einem wohldefinierten Standard abweichen.
Vielen Dank im Voraus.
Änderung der Decl von 'mine' zu 'const myPtr & mine'. Natürlich muss "tick" als "void tick (float) const;" deklariert werden und jedes durch tick modifizierte Datenelement muss "veränderbar" sein. – KitsuneYMG