30秒到达战场
这两行都会导致未定义的行为。订阅被解释为指针添加,后跟间接,即a[0][1234]/ p[1234]等同于*(a[0] + 1234)/ *(p + 1234)。根据[expr.add] / 4:如果表达式P指向具有n个元素的数组对象x的元素x [i],则表达式P + J和J + P(其中J具有值j)指向(可能是假设的)元素x [i + j],如果0≤i+ j ≤N; 否则,行为未定义。因为a[0](衰减到指针a[0][0])/ p指向a[0](作为数组)的元素,并且a[0]只有大小80,行为是未定义的。正如语言律师在评论中指出的那样,以下程序无法编译。constexpr int f(const int (&a)[2][3]){
auto p = &a[0][0];
return p[3];}int main(){
constexpr int a[2][3] = { 1, 2, 3, 4, 5, 6, };
constexpr int i = f(a);}编译器在常量表达式中出现时检测到此类未定义的行为。