首页 > 解决方案 > 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]}|

https://godbolt.org/z/MjbqEv

Windows 10 和 gcc10.1.0 位于 C:\cygwin64\usr\local\bin

我什至没有取消引用指针,所以我对编译器的“谨慎”感到有点生气。

我的问题是:

我可以做些什么来编译这段代码并保持我的设计选择有越界迭代器?(不仅仅是编译器已经允许的最后一个结尾)。我可以使用 gcc 禁用越界错误吗?

标签: c++arrayspointersconstexpr

解决方案


您不能在 C++ 中执行超出数组边界的指针算术。这种操作的行为是未定义的。并且在不断评估的表达式中具有未定义行为的程序是格式错误的,因此允许编译器拒绝编译它(并且需要对其进行诊断)。

您不能使用指针来完成这项工作,但您可以实现一个自定义迭代器类来与您的自定义 Array 类一起使用。


推荐阅读