Padrão C ++: const_iterator inesperado em multiset

Eu recentemente encontrei um problema estranho onde euconst_iterator em vez do esperadoiterator quando iterar através de um multiconjunto. Acabou sendo um problema para o MSVC, mas o g ++ me deu um erro:

erro: inicialização inválida da referência do tipo 'myPtr &' da expressão do tipo 'const boost :: shared_ptr'

Código relevante:

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

Um pouco de pesquisa revelou que é um problema com muita discussão anterior. Eu encontrei esses bits relevantes:

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

Meu conhecimento básico e compreensão sobre o assunto é limitado e, portanto, gostaria de saber se o padrão não define esse comportamento bem o suficiente, caso em que g + + e MSVC implementam o comportamento de acordo com o gosto deles ou se g + + ou MSVC se desviam de um padrão bem definido.

Desde já, obrigado.

questionAnswers(2)

yourAnswerToTheQuestion