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#528

Mein 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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage