偶然地,我发现此代码在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)
是强制转换还是初始化?让我们一一讲解这些:
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
仅当存在可用于转换的非显式转换构造函数(不适用),或者在源类型和目标类型之间定义了隐式转换时(同样,因为在整数和函数指针类型)。因此,您会得到一个错误。
希望这可以帮助!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句