STL 算法 + c'tor 不再适用于指向 C 数组的原始指针,因为指向一个过去的末端
STL algorithms + c'tors don't work anymore for raw pointers to C arrays because of pointing one past end
我刚刚遇到了编译器设置("-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 样式数组大小的语法是如此可怕,以至于我允许自己在上面使用一种简短的方法来编写它。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何读取指针的值,因为这个指针是函数的返回?
- 为什么这段代码给出错误......'a'是指针到字符指针,应该存储's'的地址,因为s是指向数组的第一个元素的指针
- 这个危险指针示例是否因为 ABA 问题而存在缺陷?
- STL 算法 + c'tor 不再适用于指向 C 数组的原始指针,因为指向一个过去的末端
- std::vector 的替代方案,因为重新分配会使指向元素的指针无效
- 测试答案是错的,对吗?它不会崩溃,因为我们删除NULL指针,这是安全的
- C++程序的断言失败,因为删除指针
- 不能将一个指针赋值给另一个指针,因为类型不匹配,或者编译器是这么说的
- 指向对象数组的指针,因为成员会覆盖内存