数组迭代器不可取消引用错误
array iterator not dereferencable error
有一个示例代码出现如下错误。
在发布模式下,它可以工作并打印五个“-”。
但是,在调试模式下,它不起作用并发生 'array iterator not dereferencable'.
的运行时错误
环境详细信息:
Windows7 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;
}
重载运算符要求至少一个操作数是 class 或枚举类型。 std::array<int, 5>::iterator
只是 int*
的 typedef,它是一个内置类型。您不需要重载比较运算符,因为指针之间的比较已经明确定义。
参考文献:
https://isocpp.org/wiki/faq/intrinsic-types#intrinsics-and-operator-overloading
https://gcc.gnu.org/onlinedocs/libstdc++/manual/iterators.html
当 b
为 arr.end()
时,您调用 *b
。这导致 undefined behaviour。您只能在引用数组元素的迭代器上使用 *
。
有一个示例代码出现如下错误。 在发布模式下,它可以工作并打印五个“-”。 但是,在调试模式下,它不起作用并发生 'array iterator not dereferencable'.
的运行时错误环境详细信息: Windows7 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;
}
重载运算符要求至少一个操作数是 class 或枚举类型。 std::array<int, 5>::iterator
只是 int*
的 typedef,它是一个内置类型。您不需要重载比较运算符,因为指针之间的比较已经明确定义。
参考文献:
https://isocpp.org/wiki/faq/intrinsic-types#intrinsics-and-operator-overloading
https://gcc.gnu.org/onlinedocs/libstdc++/manual/iterators.html
当 b
为 arr.end()
时,您调用 *b
。这导致 undefined behaviour。您只能在引用数组元素的迭代器上使用 *
。