Итератор массива не разыменованная ошибка

Существует пример кода, в котором возникает ошибка, как показано ниже. В режиме релиза он работает и печатает пять '-'. Однако в режиме отладки он не работает и возникает ошибка времени выполнения, которая является "итератором массива, не разыменованным".

сведения об окружении: Windows 7, 64-разрядная версия Visual Studio 2015, обновление 2

Я не знаю, почему существуют различия между выпуском и режимом отладки. Заранее спасибо.

#include <iostream>
#include <array>

static bool operator != (int * a, std::array<int, 5>::iterator &b)
{
    return a != &(*b);
}

int main(void)
{
    std::array<int, 5> arr = { 0,0,0,0,0 };

    for (auto* it = &arr[0]; it != arr.end(); it++)
    {
        std::cout << "-" << std::endl;
    }

    return 0;
}

2 ответа

Решение

Ты звонишь *b когда b является arr.end(), Это вызывает неопределенное поведение. Вы можете использовать только * на итераторе, который ссылается на элемент массива.

Перегрузка операторов требует, чтобы хотя бы один операнд был классом или типом перечисления. std::array<int, 5>::iterator это просто typedef для int*, который является встроенным типом. Вам не нужно перегружать оператор сравнения, так как сравнения между указателями уже четко определены.

Рекомендации:

https://isocpp.org/wiki/faq/intrinsic-types

https://gcc.gnu.org/onlinedocs/libstdc++/manual/iterators.html

Другие вопросы по тегам