Deque iterator не декремментируемый - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь запустить этот код с MSVC 2017:

#include <vector>
#include <deque>

class StripPtR {
public:
    int i;
    StripPtR (int i) : i(i) {}
};

typedef std::deque<StripPtR> StripType;
typedef std::vector<StripType> StripsType;

int main(int, char**) {
    StripType a{ {1}, {2}, {3} };

    a.insert(a.end(), a.rbegin() + 1, a.rend());

    return 0;
}

И получаю эту ошибку:

Итератор Deque не может быть уменьшен

Ошибка

Ошибка возникает во время выполнения.Во время компиляции нет ошибок или предупреждений.

Этот же код прекрасно работает с GCC.

Что не так?

1 Ответ

0 голосов
/ 25 июня 2018

std::deque::insert говорит:

Все итераторы, в том числе итератор прошлого, являются недействительными.

Версия MSVC, вероятно, проходит циклически, увеличивая / уменьшая first (или a.rbegin() + 1 в вашем коде), что означает, что вставка работает, но после этого эти итераторы становятся недействительными и вызывают ошибку времени выполнения. Эта версия приводит к тому, что вы не можете передавать итераторы в тот же контейнер, в который вы insert.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...