繁体   English   中英

将指针传递给具有引用参数的函数

[英]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:我能找到这个问题的最好的是这个号称既printintpprintint是“功能相同”,但在实践中,函数调用是不同的( printintp(&a)printint(a) )。

PS2:请注意,我不是在问指针和引用之间的区别, 这里已经解释得很清楚

这种未定义的行为是否恰好适用于我的实现?

是的。 大多数编译器在底层使用指针实现引用,但这不是由标准规定的。

标准语法不允许将指针按原样分配给引用,反之亦然,因此这些语句上的编译器错误。

将所有内容都转换为void* ,所有赌注都在类型安全上。 使用C 风格的类型转换,你可以摆脱任何事情。 你基本上是在告诉编译器你知道你在做什么,所以它应该接受它并保持安静。 这就是为什么当您知道自己真正在做什么时,这种类型转换可能是危险的,除非绝对必要,否则应该避免。 如果您必须强制转换,请改用 C++ 样式的类型转换( static_castreinterpret_cast等)。 至少到那时,你不会放弃那么多的类型安全。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM