Стандарт C++: Неожиданный const_iterator в мультимножестве

Я недавно столкнулся с нечетной проблемой, где я получу a const_iterator вместо ожидаемого iterator при итерации через мультимножество. Это оказалось надуманным вопросом для MSVC, но g ++ дал мне ошибку:

ошибка: недопустимая инициализация ссылки типа 'myPtr&' от выражения типа 'повышение константы:: shared_ptr'

Соответствующие нормы:

typedef std::multiset 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);
    }
}

Довольно мало исследования показало, что это - проблема с большим предыдущим обсуждением. Я нашел эти соответствующие биты:

Мое фоновое знание и схватывание по проблеме ограничены, и таким образом я хотел бы знать, не определяет ли стандарт это поведение достаточно хорошо, в этом случае g ++, и MSVC реализуют поведение к их симпатии или отклоняются ли или g ++ или MSVC от четко определенного стандарта.

Заранее спасибо.

8
задан svenstaro 10 January 2010 в 20:19
поделиться

1 ответ

Итераторы для набора и мультисетов были изменены со стороны стандартной пары итератора итератора итератора итератора, чтобы просто быть итераторами Const. Причиной этого изменения заключалась в том, что они являются упорядоченными контейнерами, а изменение элемента внутри итератора может фактически недействовать это ограничение на заказ.

Версия GCC, которую вы тестируете против, сделал это изменение, версия VC, которую вы используете, не имеет. VC10 (и VC9 SP1, я верю) Всегда возвращайте Const_iterators из наборов и многосеек.

23.2.4 / 6 из последнего проекта C ++ 1x (N3000.PDF в данный момент) говорит

для ассоциативных контейнеров, где Тип значения такой же, как ключ Тип, как итератор и const_iterator являются постоянными итераторами.

STD :: SET и STD :: Multi_Set - это ассоциативные контейнеры, в которых тип значения такой же, как тип ключа.

16
ответ дан 5 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: