gpt4 book ai didi

c++ - STL 算法 + c'tors 不再适用于指向 C 数组的原始指针,因为指向一个结束

转载 作者:搜寻专家 更新时间:2023-10-31 00:53:50 24 4
gpt4 key购买 nike

我刚刚遇到了一个问题,我的编译器设置(“-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() 因为代码必须兼容 pre C++11 :-((我们必须支持(非常)旧的系统......)

tobi303而 Omnifarious 的建议显然是正在发生的事情......我爱上了古老的差一错误。我现在觉得自己很傻。

干杯!

最佳答案

vals + vals.size + 1 

是一过一(或二过一)。数组中的最后一个指针是

vals + vals.size - 1

因此最后一个应该是

vals + vals.size

如果您在代码中修复此问题,the warning is gone and it compiles .

但是,请考虑使用 std::begin()std::end() 或简单地使用 std::array。获取 C 样式数组大小的语法太可怕了,以至于我允许自己使用上面的简短方法来编写它。

关于c++ - STL 算法 + c'tors 不再适用于指向 C 数组的原始指针,因为指向一个结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47439123/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com