C ++ Standard: Unerwarteter const_iterator in multiset
Ich bin vor kurzem auf ein seltsames Problem gestoßen, bei dem ich einen bekommen habeconst_iterator
statt der erwarteteniterator
beim Durchlaufen eines Multisets. Es stellte sich heraus, dass es für MSVC kein Problem war, aber g ++ gab mir einen Fehler:
Fehler: Ungültige Initialisierung der Referenz vom Typ 'myPtr &' vom Ausdruck vom Typ 'const boost :: shared_ptr'
Relevanter 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);
}
}
Nachforschungen haben ergeben, dass dies ein Problem bei vielen früheren Diskussionen ist. Ich habe diese relevanten Teile gefunden:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=14990http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#322http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#103http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#279http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#528Mein Hintergrundwissen und Verständnis zu diesem Thema ist begrenzt. Daher möchte ich wissen, ob der Standard dieses Verhalten nicht gut genug definiert. In diesem Fall implementieren g ++ und MSVC das Verhalten nach Belieben oder ob g ++ oder MSVC von a abweichen klar definierter Standard.
Danke im Voraus.