C和C++不完全数组指针转换规则的区别

Difference in incomplete array pointer conversion rules between C and C++

当我用 gccg++ 编译以下代码时,g++ 给出错误而不是 gcc。请注意,代码从 int (*)[4] 转换为 int (*)[](这是指向不完整数组类型的指针)。

int arr[4];
int (*p_arr)[] = &arr;

中所述,C 语言允许这种转换。但是为什么 C++ 不允许这样做并给出错误 error: cannot convert ‘int (*)[4]’ to ‘int (*)[]’ in assignment。我知道 C++ 比 C 更类型安全,但是这个赋值真的是类型不安全的,因为后来对指针的取消引用(例如 sizeof(*p_arr))无论如何也会在 C 中给出错误?

是的,这个赋值确实是类型不安全的。

在 C++ 中,数组类型包括维度。总是。

(大部分。)

转换本身是安全的,但请记住,C 语言中允许这种转换的相同规则也允许相反方向的转换。

int main() {
  int array[4] = {0};
  int (*ptr4)[4] = &array;
  int (*ptrN)[]  = ptr4;
  int (*ptr5)[5] = ptrN; /* oh dear */
}

这显然很糟糕。 C++ 已经删除了这条规则,说 int[4]int[] 是兼容类型的规则,并且几乎摆脱了兼容类型的概念。

一些安全的特定转换are being considered for inclusion in a future version of C++。它们也包括您的转化。