constexpr禁止指向数组的指针超出范围



我正在用constexpr方法实现一个Array类。在我的设计中,我允许迭代器超过end((,因为我不做:while(it!=arr.end(((,而是通过内部比较两个原始指针来做:which(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禁用越界错误吗?

我甚至没有取消引用指针,所以我对"谨慎;编译器的。

您观察到的不是一个过于谨慎的编译器。不允许将指针增量超过数组的最后一个元素一个以上。你不需要取消引用指针就有麻烦了。

只允许将指针增加到最后一个元素之后的一个(并且不能取消引用最后一个指针之后的那个(。

在非常量表达式上下文中,递增ptr + 4将是未定义的行为。然而,在编译期间,没有未定义的行为,编译器会诊断问题。

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

您不能用指针来实现这一点,但您可以实现一个自定义迭代器类来代替您的自定义数组类。

最新更新