奇怪的行为,用int初始化一个函数指针?

时间:2013-10-05 16:25:53

标签: c++ visual-studio-2012 casting initialization function-pointers

无意中,我发现此代码在VS2012上编译。

typedef void (*func)();
func f = func(12);

f初始化为整数12作为其地址。 据我所知,从整数转换为函数指针是有效的,如下所示:

func f = (func)12;

虽然语句func(12)看起来更像构造函数,所以我尝试了这个:

func f(12);

编译失败。


func f = (func)12  //ok, cast           1
func f = func(12); //ok, what?          2
func f(12);        //failed             3
func f = 12;       //failed             4

所以我的问题是:

  1. func(12)的真正基础语法是什么,是演员表还是初始化?
  2. 如何使用整数初始化函数指针?
  3. 第四个表达式应该编译吗?第三个怎么样?

1 个答案:

答案 0 :(得分:3)

让我们逐一介绍这些:

func f = (func)12  //ok, cast           1

这里,您使用显式强制转换将整数值12转换为函数指针。此转换不允许作为普通的隐式转换,但它是可以接受的,因为C ++可以使用reinterpret_cast将整数和指针类型相互转换。它不安全或不便携。

func f = func(12); //ok, what?          2

这是上述的不同语法。只要(type) value是基本类型,语法type(value)type就是相同的。

func f(12);        //failed             3

在这里,您正在尝试创建一个初始化为值为12的类型为func的对象。这种对象声明样式只允许使用

  • 有一个可以进行转换的构造函数(不适用; func是原始类型),或
  • 在源类型和定义类型之间定义了隐式转换(不适用;在整数和指针类型之间没有隐式转换)。

因此,编译器报告错误。

func f = 12;       //failed             4

仅当存在可用于执行转换的非显式转换构造函数(不适用),或者在源类型和目标类型之间定义了隐式转换时,这仅适用(再次,因为没有定义转换,因此不适用)整数和函数指针类型之间)。因此,您会收到错误。

希望这有帮助!