STL 算法 + c'tor 不再适用于指向 C 数组的原始指针,因为指向一个过去的末端



我刚刚遇到了编译器设置("-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 样式数组大小的语法是如此可怕,以至于我允许自己在上面使用一种简短的方法来编写它。

相关内容

最新更新