C ++ Standard: Nieoczekiwany const_iterator w multiset
Niedawno wpadłem na dziwny problem, w którym dostanęconst_iterator
zamiast oczekiwanegoiterator
podczas iteracji przez multiset. Okazało się, że nie stanowi to problemu dla MSVC, ale g ++ dał mi błąd:
błąd: nieprawidłowa inicjalizacja odwołania typu „myPtr &” z wyrażenia typu „const boost :: shared_ptr”
Odpowiedni kod:
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);
}
}
Wiele badań ujawniło, że jest to problem z wieloma wcześniejszymi dyskusjami. Znalazłem odpowiednie elementy:
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#528Moja wiedza i doświadczenie w tej kwestii są ograniczone i dlatego chciałbym wiedzieć, czy standard nie definiuje tego zachowania wystarczająco dobrze, w którym przypadku g ++ i MSVC implementują zachowanie do swoich potrzeb lub czy g ++ lub MSVC odbiegają od dobrze zdefiniowany standard.
Z góry dziękuję.