【问题标题】:Passing a pointer to a function with reference parameter将指针传递给带有引用参数的函数
【发布时间】:2021-02-19 16:26:28
【问题描述】:

通常,这会被编译器捕获。但是使用对函数指针的强制转换我们可以做到这一点。

我可能措辞不当,这里有一个例子可以更好地说明我的问题:

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:在这个问题上我能找到的最好的方法是 this,它声称 printintpprintint “功能相同”,尽管在实践中,函数调用是不同的(printintp(&a) 和 @ 987654333@).

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

【问题讨论】:

    标签: c++ pointers reference parameter-passing


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-08-25
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      • 2016-11-07
      • 2019-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多