例如,如果我们有一个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过载.