C ++ Standard: Nieoczekiwany const_iterator w multiset

Niedawno wpadłem na dziwny problem, w którym dostanęconst_iterator zamiast oczekiwanegoiterator podczas iteracji przez multiset. Okazało się, że nie stanowi to problemu dla MSVC, ale g ++ dał mi błąd:

błąd: nieprawidłowa inicjalizacja odwołania typu „myPtr &” z wyrażenia typu „const boost :: shared_ptr”

Odpowiedni kod:

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);
    }
}

Wiele badań ujawniło, że jest to problem z wieloma wcześniejszymi dyskusjami. Znalazłem odpowiednie elementy:

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

Moja wiedza i doświadczenie w tej kwestii są ograniczone i dlatego chciałbym wiedzieć, czy standard nie definiuje tego zachowania wystarczająco dobrze, w którym przypadku g ++ i MSVC implementują zachowanie do swoich potrzeb lub czy g ++ lub MSVC odbiegają od dobrze zdefiniowany standard.

Z góry dziękuję.

questionAnswers(2)

yourAnswerToTheQuestion