c – 即使使用constexpr索引,编译器为什么允许超出范围的数组访问?

前端之家收集整理的这篇文章主要介绍了c – 即使使用constexpr索引,编译器为什么允许超出范围的数组访问?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
例如,如果我们有一个std ::数组,并使用constexpr实例化一个超出绑定的元素,编译器将不会报告错误
constexpr int EvaluateSpecialArrayIndex(int a)
{ return a * sizeof(int); }

array<int,5> arr;

cout << arr[98] << endl; //compiles fine

cout << arr[EvaluateSpecialArrayIndex(4)] << endl; //the same as above

我们不能限制这个吗?

解决方法

为了确保在编译时对constexpr函数进行求值,必须强制它们使其结果为constexpr.例如:
#include <array>

int
main()
{
    constexpr std::array<int,5> arr{1,2,3,4,5};
    int i = arr[6];  // run time error
}

然而:

#include <array>

int
main()
{
    constexpr std::array<int,5};
    constexpr int i = arr[6];  // compile time error
}

不幸的是,为了实际工作,std :: array必须符合C14规范,而不是C 11规范.由于C 11规范没有使用constexpr标记std :: array :: operator []的const过载.

所以在C 11,你没有运气.在C 14中,您可以使其工作,但只有数组和调用索引运算符的结果都声明为constexpr.

澄清

数组索引的C 11规范如下:

reference operator[](size_type n);
          const_reference operator[](size_type n) const;

而数组索引的C14规范如下:

reference operator[](size_type n);
constexpr const_reference operator[](size_type n) const;

即constexpr被添加到C14的const过载.

原文链接:https://www.f2er.com/c/113205.html

猜你在找的C&C++相关文章