gpt4 book ai didi

c++ - 在被调用函数中更改函数指针(std::function)是否安全?

转载 作者:IT老高 更新时间:2023-10-28 22:39:21 25 4
gpt4 key购买 nike

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

std::function<void()> fun;

void foo() {
std::cout << "foo\n";
}

void bar() {
std::cout << "bar\n";
fun = foo;
}

int main() {
fun = bar;
fun();
fun();
}

我看不出有任何问题,而且效果很好(见 here),但是我不确定这样做是否合法。有什么我想念的吗?可能在 c++ 标准草案中(我很快查了一下,但到目前为止什么也没看到)。

最佳答案

这对于函数指针是合法的。

当您使用目标分配或构造 std::function 时,它会创建目标的 拷贝。在将函数分配给 std::function 的情况下,this 实际上将函数指针存储为目标对象。

当您调用 operator() 时,需要返回如果您使用参数调用该目标会发生什么。

在作为拷贝存储在 std::function 中的函数对象拷贝的“主体”内,如果您重新分配给 std::function,这会破坏旧的目标函数对象。

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

但是,如果您存储了函数 objects(lambdas、手动的、其他 std::functions、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();
}

live example .

如您所见,这可能很脆弱。

关于c++ - 在被调用函数中更改函数指针(std::function)是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42651046/

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