c++ - constexpr 禁止使用超出范围的数组指针
问题描述
我正在使用 constexpr 方法实现一个 Array 类。在我的设计中,我允许迭代器超过 end(),因为不是这样做:while (it != arr.end()),而是通过在内部比较两个原始指针来做:while(arr.finished(it)) . 它适用于非 constexpr 数组实例,但不适用于 constexpr 实例,因为以下问题:
#include <array>
int main()
{
static constexpr std::array<int, 3> arr{};
constexpr const int* ptr = &arr[0];
constexpr const int* ptr2 = (const int*)ptr + 4;// error
return 0;
}
我收到消息:
array subscript value 4 is outside the bounds of array type _Type {aka const int [3]}|
Windows 10 和 gcc10.1.0 位于 C:\cygwin64\usr\local\bin
我什至没有取消引用指针,所以我对编译器的“谨慎”感到有点生气。
我的问题是:
我可以做些什么来编译这段代码并保持我的设计选择有越界迭代器?(不仅仅是编译器已经允许的最后一个结尾)。我可以使用 gcc 禁用越界错误吗?
解决方案
您不能在 C++ 中执行超出数组边界的指针算术。这种操作的行为是未定义的。并且在不断评估的表达式中具有未定义行为的程序是格式错误的,因此允许编译器拒绝编译它(并且需要对其进行诊断)。
您不能使用指针来完成这项工作,但您可以实现一个自定义迭代器类来与您的自定义 Array 类一起使用。
推荐阅读
- python - 无法使用 Python 请求复制 AJAX
- javascript - 角度异步保护 canActivate() 函数
- android - 颤振应用程序未与firebase数据库连接
- shell - 运行一个需要密码的脚本
- python - 通过签入另一个 df 从 df 中删除不匹配的行
- python - 如何在熊猫数据框中将数据从对象/字符串格式获取到 int?
- c - 赋值形式不兼容的指针类型
- sql - 查询检查一个值是否存在,以及它是否不添加表中的所有行?
- php - 登录/登录后如何区分用户和管理员的主页?
- express - Express JS:总是得到消息:TypeError:赋值给常量变量