无意中,我发现此代码在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
所以我的问题是:
func(12)
的真正基础语法是什么,是演员表还是初始化?答案 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
仅当存在可用于执行转换的非显式转换构造函数(不适用),或者在源类型和目标类型之间定义了隐式转换时,这仅适用(再次,因为没有定义转换,因此不适用)整数和函数指针类型之间)。因此,您会收到错误。
希望这有帮助!