C和C++之间不完整数组指针转换规则的差异

use*_*104 5 c c++ arrays pointers g++

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

int arr[4];
int (*p_arr)[] = &arr;
Run Code Online (Sandbox Code Playgroud)

不完整数组类型中所述?,C语言允许这种转换.但为什么C++不允许这样做并给出错误error: cannot convert ‘int (*)[4]’ to ‘int (*)[]’ in assignment.我知道C++比C更安全类型,但是这个赋值实际上是类型不安全的,因为指针的后来引用(例如sizeof(*p_arr))无论如何都会产生错误C吗?

小智 1

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

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

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

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