为什么C++中函数数组类型的is_same判断结果与typeid输出不一致?
原因说明
两个判断对象本质不是同一类型
你定义的类型别名ArrayOfFunctionsT = int (* [])(int)属于元素为int(int)函数指针的未知边界数组类型,是C中的不完整类型。
当你用ArrayOfFunctionsT functions = {};声明变量时,GCC的扩展逻辑会给这个空初始化的未知边界数组分配零长度的存储空间,但decltype(functions)取的是变量的声明类型,也就是int (*[])(int),而非实际存储的零长度数组类型。而你用来对比的int (*[0])(int)是GCC扩展支持的零长度完整数组类型,和未知边界数组本身就不满足类型等价要求,所以std::is_same返回0是符合C类型规则的。typeid输出一致只是GCC的实现细节typeid的name()方法返回值是编译器实现定义的,GCC的名字修饰规则中,未知边界数组T[]和零长度数组T[0]的修饰名相同,你看到的A0_PFiiE就是两者的统一输出,这个输出一致不代表类型等价,仅为GCC的实现特性。
另外要注意,零长度数组是GCC对C标准的扩展,在C++中属于非标准语法,不同编译器的处理逻辑存在差异。
内容的提问来源于stack exchange,提问作者Anton
相关产品推荐
相关产品推荐

