gpt4 book ai didi

c++ - 为什么需要引用的函数使用指针?

转载 作者:行者123 更新时间:2023-12-01 14:07:38 31 4
gpt4 key购买 nike

我正在用 C++ 编写一个使用 C 库的程序。该库采用指向回调函数的指针,我希望它调用实例方法。幸运的是,该库采用了一个额外的数据参数,它只是一个“void *”,并原封不动地传递给回调。所以,我创建了一个通用的回调包装函数。

void callbackWrapper(std::function<void ()> &func) {
func();
}

现在,当我需要在库中注册一个回调时,我将一个指向 callbackWrapper 函数的指针作为要调用的函数传递,并传递一个指向 std::function 的指针作为额外的数据参数。当回调发生时,它调用我的包装器,然后它调用实际的方法/lambda/我真正想调用的任何东西。

但是,上面的代码有一个错误。我使用了“&”而不是“*”,这意味着该函数需要一个对 std::function 的引用,而不是一个指针。该函数应该像这样定义:
void callbackWrapper(std::function<void ()> *func) {
(*func)();
}

我有很长一段时间没有注意到这个错误——因为它工作得很好。我只是注意到,因为我正在追踪一个不相关的错误,并且碰巧看到了它。所以,我的问题是,为什么?我有三个可能的答案:
  • C++ 标准允许在这种情况下自动提升指向引用的指针。
  • 我的编译器 (gcc 9.3.1) 注意到不匹配并默默地为我修复了它。
  • 指针的地址恰好落在堆栈帧中调用可能成功的正确位置。

  • 我的任何理论都是正确的吗?如果不是,发生了什么?

    最佳答案

    对于您的示例,情况 3 很可能是正确的。

    将引用当作指针传递是非常明智的,大多数 ABI 可能会这样做。

    例如,安腾 C++ ABI says (这是在 Linux/x64 上使用的 ABI):

    Reference parameters are handled by passing a pointer to the object bound to the reference.

    关于c++ - 为什么需要引用的函数使用指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61416071/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com