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

弗拉姆

偶然地,我发现此代码在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. 第四表达式应该编译吗?那第三个呢?
templatetypedef

让我们一一讲解这些:

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

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

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

这是上面的不同语法。语法(type) valuetype(value)相同,只要type是原始类型即可。

func f(12);        //failed             3

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

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

因此,编译器报告错误。

func f = 12;       //failed             4

仅当存在可用于转换的非显式转换构造函数(不适用),或者在源类型和目标类型之间定义了隐式转换时(同样,因为在整数和函数指针类型)。因此,您会得到一个错误。

希望这可以帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

用空指针常量初始化:哪种行为正确?

来自分类Dev

用类构造函数初始化类对象的指针?

来自分类Dev

奇怪的GCC阵列初始化行为

来自分类Dev

奇怪的GCC阵列初始化行为

来自分类Dev

奇怪的jQuery DataTables初始化行为

来自分类Dev

用静态函数初始化静态const int

来自分类Dev

C ++字符串-使用初始化列表构造函数时的奇怪行为

来自分类Dev

释放未初始化的指针会导致未定义的行为吗?

来自分类Dev

用C ++初始化指针

来自分类Dev

在C中初始化int指针

来自分类Dev

有关在printf函数中使用的未初始化的整数指针的行为的问题

来自分类Dev

函数指针的静态初始化

来自分类Dev

奇怪的未初始化const成员行为

来自分类Dev

C ++ 11奇怪的括号初始化行为

来自分类Dev

初始化结构体数组的奇怪行为

来自分类Dev

初始化结构体数组的奇怪行为

来自分类Dev

在java中初始化final字段的奇怪行为

来自分类Dev

在传递指向函数的指针之前,我必须始终对其进行初始化吗?

来自分类Dev

在传递指向函数的指针之前,我必须始终对其进行初始化吗?

来自分类Dev

用两个不同的构造函数初始化指向数组的指针

来自分类Dev

用逗号相互初始化吗?

来自分类Dev

用逗号相互初始化吗?

来自分类Dev

typedef函数指针->从不兼容的指针类型初始化

来自分类Dev

用函数初始化矩阵

来自分类Dev

初始化指向同名函数的静态成员函数指针

来自分类Dev

用'git describe'的输出初始化变量的奇怪结果

来自分类Dev

用001 vs 1初始化int有区别吗?

来自分类Dev

初始化int * p = malloc(1000);也可以用RAII样式处理吗?

来自分类Dev

使用openCV copyTo函数时用255初始化矩阵吗?

Related 相关文章

热门标签

归档