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