【发布时间】:2015-06-20 14:56:25
【问题描述】:
我想不通:
int main() {
int (*) (int *) = 5;
return 0;
}
上面的赋值是用 g++ c++11 编译的。我知道int (*) (int *)是一个指向函数的指针,它接受(int *)作为参数并返回一个int,但我不明白你怎么能把它等同于5。起初我以为它是一个不断返回5的函数(根据我最近在 F# 中的学习,可能,哈哈),然后我简要地认为,函数指针指向内存位置 5,但这显然不起作用,十六进制值也不起作用。
认为这可能是因为函数返回一个 int,并且分配一个 int 是可以的(不知何故),我也尝试了这个:
int * (*) (int *) = my_ptr
其中my_ptr 的类型为int *,与第二个函数指针的类型相同,与第一种情况下的int 类型一样。这不编译。分配 5 或任何 int 值,而不是 my_ptr,也不会针对此函数指针进行编译。
那么赋值是什么意思呢?
更新 1
我们已确认这是一个错误,如最佳答案所示。但是,仍然不知道您分配给函数指针的值实际发生了什么,或者分配发生了什么。任何(好的)解释都将非常感激!请参阅下面的编辑以更清楚地了解问题。
编辑 1
我使用的是 gcc 版本 4.8.2(在 Ubuntu 4.8.2 中)
编辑 2
实际上,在我的编译器上将它等同于任何东西都可以。甚至将其等同于 std::string 变量或返回双精度的函数名也可以。
编辑 2.1
有趣的是,让它成为一个函数指针,指向任何返回非指针数据类型的函数,都会让它编译,比如
std::string (*) () = 5.6;
但是一旦函数指针指向一个返回某个指针的函数,它就不会编译,比如with
some_data_type ** (*) () = any_value;
【问题讨论】:
-
嗯...看起来不太对劲,clang 不接受。可能是 gcc 扩展(或错误)。
-
g++ 编译,但 gcc 不工作:
error: expected identifier or '(' before ')' token -
@0x499602D 请注意,代码没有给指针命名。使用
int *x = 5,您将其命名为x。使用int * (*x) (int *) = 5将无法编译。 (尽管它会编译为 C 代码)。 -
精简测试用例:
int(*) = 5;和int(*);
标签: c++ pointers function-pointers