[英]Passing a pointer to a function with reference parameter
通常,这是由编译器捕获的。 但是使用对函数指针的强制转换我们可以设法做到这一点。
我可能措辞不当,这里有一个例子可以更好地说明我的问题:
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
OK? 这种未定义的行为是否恰好适用于我的实现? 如果没有,参数int &i
如何绑定到对象a
如果我们只是传递它的地址,为什么它拒绝我标记为ERROR 2
?
PS:我能找到这个问题的最好的是这个号称既printintp
和printint
是“功能相同”,但在实践中,函数调用是不同的( printintp(&a)
和printint(a)
)。
这种未定义的行为是否恰好适用于我的实现?
是的。 大多数编译器在底层使用指针实现引用,但这不是由标准规定的。
标准语法不允许将指针按原样分配给引用,反之亦然,因此这些语句上的编译器错误。
将所有内容都转换为void*
,所有赌注都在类型安全上。 使用C 风格的类型转换,你可以摆脱任何事情。 你基本上是在告诉编译器你知道你在做什么,所以它应该接受它并保持安静。 这就是为什么当您不知道自己真正在做什么时,这种类型转换可能是危险的,除非绝对必要,否则应该避免。 如果您必须强制转换,请改用 C++ 样式的类型转换( static_cast
、 reinterpret_cast
等)。 至少到那时,你不会放弃那么多的类型安全。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.