当我试图比较两种类型的函数数组时,我遇到了这种奇怪的行为。
我有测试代码:
using ArrayOfFunctionsT = int (* [])(int);
ArrayOfFunctionsT functions = {};
std::cout << typeid(decltype(functions)).name() << " vs " << typeid(int (*[0])(int)).name() << "n";
std::cout << std::is_same<decltype(functions), int (*[0])(int)>::value << "n";
执行的结果是:
A0_PFiiE vs A0_PFiiE
0
目前我使用的是gcc 10.2.1。这种行为的原因是什么?
快速回答:C++标准禁止使用零大小的数组。因此,之后产生的任何结果都依赖于编译器。
在评论部分,人们提到:
is_same
无法与int (*[0])(int)
等表达式一起使用
然而,这不是这里的原因,is_same
确实处理类似的表达式。您可以从更简单的代码中创建具有类似结果的代码片段:
int arr1[] = {};
int arr2[0] = {};
std::cout << typeid(decltype(arr1)).name() << " vs " << typeid(arr2).name() << "n";
std::cout << std::is_same<decltype(arr1), decltype(arr2)>::value << "n";
演示
GCC再次打印错误,Clang打印真实。
这里的问题是functions
是一个零大小的数组,这是C++标准所禁止的。任何进行编译的操作都依赖于编译器扩展,因此结果依赖于编译器。打开-Wpedantic
将从代码中发出警告或错误。
这里的更多信息:如果我在C/C++中定义一个0大小的数组,会发生什么?