我刚刚遇到了编译器设置("-Werror")的问题,以及使用指向 C 样式数组的原始指针作为 STL 迭代器。我得到一个
array_bounds_problem.cc:12:36: error: array subscript is above array bounds [-Werror=array-bounds]
const int* p = std::find(vals, vals + (sizeof(vals)/sizeof(vals[0]))+1, 12);
~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
问题在于,对于使用一对迭代器的 STL 算法/构造函数,end
迭代器必须指向一个过去结束......这确实是在例如 C 样式数组的存储之外。
这里有一个例子:http://coliru.stacked-crooked.com/a/59ad7b82fe63211d
任何想法我如何使用"-Werror"进行编译并仍然使用与 STL 算法/容器混合的 C 样式数组?
编辑
右!非常感谢您的回答! 不幸的是,我无法使用std::array
/std::begin()/end()
,因为代码必须与 C++11 之前兼容:-( (我们必须支持(非常)旧的系统...
tobi303 和 Omnifarious 的建议显然是正在发生的事情...... 我爱上了古老的错误。我现在觉得很傻。
干杯!
vals + vals.size + 1
是一个过去一个过去结束(或两个过去结束)。数组中的最后一个指针是
vals + vals.size - 1
因此,过去的一个结束应该是
vals + vals.size
如果在代码中修复此问题,则警告将消失并编译。
但是,请考虑使用std::begin()
和std::end()
或只是std::array
.获取 C 样式数组大小的语法是如此可怕,以至于我允许自己在上面使用一种简短的方法来编写它。