通常,这是由编译器捕获的。但是使用强制转换为函数指针,我们可以做到这一点。
我的措词可能不正确,这是一个示例,可以更好地说明我的问题:
void printintp(int *ip)
{
printf("pointer = %p\n", ip);
printf("*pointer = %d\n", *ip);
}
void printint(int &i)
{
printf("int = %d\n", i);
}
int main()
{
int a = 555;
//int &irp = &a; // ERROR 1
void (*f)(void *);
//printint((int &) &a); // ERROR 2
f = (void (*)(void *))printintp;
f(&a);
f = (void (*)(void *))printint;
//printint(&a); // ERROR 3 (invalid conversion of `int *` to `int`)
f(&a); // GOOD (why?)
return 0;
}
当然,输出是人们所期望的:
pointer = 0x7ffd01995bf4
*pointer = 555
int = 555
所以我的问题提炼为:为什么将指针传递&a
给预期功能printint
好?这种不确定的行为是否恰好适用于我的实现?如果不是,如果我们只是传递参数的地址,那么参数如何int &i
绑定到对象a
,为什么它拒绝我标记为的对象ERROR 2
?
PS:我能找到这个问题的最好的是这个号称既printintp
和printint
是“功能相同”,但在实践中,函数调用是不同的(printintp(&a)
和printint(a)
)。
PS2:请注意,我并不是在问指针和引用之间的区别,这里已经对此进行了详细说明。
这种不确定的行为是否恰好适用于我的实现?
是。大多数编译器使用内部的指针来实现引用,但这不是标准规定的。
标准语法不允许将指针原样分配给引用,反之亦然,因此,这些语句的编译器错误。
将所有内容都投放到void*
,所有赌注都取决于类型安全性。使用C风格的类型转换,您几乎可以逃脱一切。您基本上是在告诉编译器您知道自己在做什么,因此它应该只接受它并且保持安静。这就是为什么当您不知道自己在做什么时,这种类型转换会很危险的原因,除非绝对必要,否则应该避免。如果你一定要投,更喜欢C ++ -风格的类型转换,而不是(static_cast
,reinterpret_cast
,等)。至少到那时,您不会放弃那么多的类型安全性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句