Стандарт C ++: неожиданный const_iterator в мультимножестве
Я недавно столкнулся с странной проблемой, где я получилconst_iterator
вместо ожидаемогоiterator
при переборе мультимножества. Это оказалось не проблема для MSVC, но g ++ дал мне ошибку:
ошибка: неверная инициализация ссылки типа «myPtr &» из выражения типа «const boost :: shared_ptr»
Соответствующий код:
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);
}
}
Немного исследований показали, что это проблема многих предыдущих обсуждений. Я нашел эти соответствующие биты:
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Мои базовые знания и понимание этой проблемы ограничены, и поэтому я хотел бы знать, недостаточно ли стандарт определяет это поведение достаточно хорошо, в этом случае g ++ и MSVC реализуют поведение по своему вкусу, или же g ++ или MSVC отклоняются от четко определенный стандарт.
Заранее спасибо.