C和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中允许此转换的相同规则也允许它在相反的方向上。

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

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

一些安全的特定转换正在考虑包含在未来的C ++版本中 。 它们也包括您的转换。

是的,这项任务确实是类型不安全的。

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

(大多。)