【发布时间】:2015-02-17 22:05:33
【问题描述】:
例如,如果我们有一个 std::array 并且我们使用 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
我们不能以某种方式限制它吗?
【问题讨论】:
-
注意:标准不允许
arr[n]被拒绝,因为直到执行到那个点才会引起UB;例如这段代码可能在一个永远不会被调用的函数中。 -
@MattMcNabb 可能是not as simple as that。
-
@GSerg UB 一旦被击中就可以进行时间旅行,但如果没有被击中则不能(起初听起来很矛盾,但实际上并非如此,正如第一个答案所示)。我猜你可能会争辩说,如果保证代码路径达到
arr[98],那么 UB 可以时间旅行回到编译阶段
标签: c++ arrays c++14 constexpr c++17