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