4

偶然发现这段代码是在 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. 第 4 个表达式应该编译吗?第三个呢?
4

1 回答 1

3

让我们一一来看看:

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

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

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

这是与上述不同的语法。只要是原始类型,语法(type) value和相同。type(value)type

func f(12);        //failed             3

在这里,您试图创建一个func初始化为值 12 的类型的对象。这种对象声明样式仅在以下情况下才允许使用

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

因此,编译器报告错误。

func f = 12;       //failed             4

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

希望这可以帮助!

于 2013-10-08T03:52:49.783 回答