Estándar de C ++: const_iterator inesperado en multiset

Recientemente me encontré con un problema extraño en el que obtendría unaconst_iterator en lugar de lo esperadoiterator cuando se itera a través de un multiset. Resultó ser un problema para MSVC pero g ++ me dio un error:

error: inicialización no válida de la referencia del tipo 'myPtr &' desde la expresión del 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);
    }
}

Bastante un poco de investigación reveló que es un problema con mucha discusión previa. Encontré estos 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

Mi conocimiento y comprensión de este tema son limitados y, por lo tanto, me gustaría saber si el estándar no define este comportamiento lo suficiente, en cuyo caso g ++ y MSVC implementan el comportamiento a su gusto o si g ++ o MSVC se desvían de un Estándar bien definido.

Gracias por adelantado.

Respuestas a la pregunta(2)

Su respuesta a la pregunta