在称为函数内更改功能指针(STD ::函数)安全吗?

Is it safe to change a function pointer (std::function) inside a called function?

本文关键字:函数 STD 安全 功能 指针      更新时间:2023-10-16

我有一个指向函数的 std::function。在此功能中,我将指针更改为另一个功能。

std::function<void()> fun;
void foo() {
    std::cout << "foon";
}
void bar() {
    std::cout << "barn";
    fun = foo;
}
int main() {
    fun = bar;
    fun();
    fun();
}

我看不到任何问题,而且效果很好(请参阅此处),但是我不确定这是否合法。有什么我缺少的吗?也许在C 标准草稿中(我很快检查了,但到目前为止什么都没看)。

这与功能指针合法。

当您用目标分配或构造std::function时,它会创建目标的副本。如果将函数分配给std::function,则实际上将功能指针存储为目标对象。

调用operator()时,需要返回如果您用参数调用目标。

std::function中存储为副本的函数对象副本的"正元"中,如果您重新分配给std::function,则会摧毁旧目标函数对象。

销毁功能指针对指向的函数中执行的代码的有效性没有影响。

但是,如果您存储了函数对象(lambdas,手动,其他std::function s, std::bind等)在this被破坏时的课程中。简而言之,您将不再能够执行依赖实例"本地状态"的任何事情。

std::function<void()> fun;
struct bob {
  std::string name;
  bob* next = 0;
  void operator()() const {
    std::cout << name << "n";
    if (next) fun = *next;
    // undefined behavior:
    // std::cout << name << "n";
  }
};
bob foo = {"foo"};
bob bar = {"bar", &foo};
int main() {
  fun = bar;
  fun();
  fun();
}

现场示例。

您可以看到,这可能很脆弱。

,如果您在没有适当考虑和代码文档中这样做的话,它可能会回来咬您,但是没有逻辑原因不起作用。

在c 中,不需要函数的地址,在返回编码中的函数中,

中的函数中都不需要。

如果它用某种语言不起作用,则规定的人可能不接受 - 如果是一个不错的编译器。

相关文章: