如何解决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类一起使用。
,我什至没有取消对指针的引用,所以我对编译器的“谨慎”感到愤怒。
您观察到的不是过度谨慎的编译器。不允许在数组的最后一个元素之后递增一个指针。您不必解除引用指针的麻烦。
只允许将指针增加到最后一个元素之后的一个指针(并且您不可以取消引用那个最后一个指针)。
在非常量表达式上下文中,递增ptr + 4
将是未定义的行为。但是,在编译期间,没有未定义的行为,编译器会诊断出问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。