为什么我们不能比较C++中的函数数组类型?



当我试图比较两种类型的函数数组时,我遇到了这种奇怪的行为。

我有测试代码:

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大小的数组,会发生什么?

最新更新