在称为函数内更改功能指针(STD ::函数)安全吗?
Is it safe to change a function pointer (std::function) inside a called function?
我有一个指向函数的 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 中,不需要函数的地址,在返回编码中的函数中,
中的函数中都不需要。如果它用某种语言不起作用,则规定的人可能不接受 - 如果是一个不错的编译器。
相关文章:
- 无法引用该函数" std:: variant <_Types...> operator =",因为此函数已被删除
- 错误:使用已删除的函数"std::unique_ptr<...>
- 我有模板功能.通过使用函数std::for_each,用这个容器中的最大数字替换每个正数
- 如何使用函数std::min()来计算最小值
- 删除了 g++ 在 linux 中basic_stringstream函数 std
- 如何在 c++ 中使用返回类型导出函数 std::map
- 错误:使用已删除的函数"std::atomic<_Tp>::atomic() [_Tp = node]"
- 使用 SFINAE 检查函数 std::to_string 是否存在类型
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误
- 为什么函数 std::basic_streambuf::setg() 需要非常量 agruments
- C++将已删除的函数 std::unique_ptr 与基类一起使用
- 奇怪的错误:当没有真正创建指针时,使用已删除的函数'std::unique_ptr<_Tp,_Dp>::unique_ptr
- 通过模板构造函数(std ::功能和迷你案例)将构造函数触发
- 错误:使用已删除的函数"std::atomic<_Tp>::atomic()
- 错误:使用已删除的函数std::basic_ofstream(OpenCV和C++11)
- 类成员容器迭代器在成员函数std::find中不兼容,但为什么不兼容呢
- 没有构造函数 std::istream_iterator 的实例
- 错误:没有与参数列表匹配的重载函数"std::make_shared"实例
- 错误:使用已删除的函数"std::thread::thread(const std::thread&)"
- 不能在没有对象的情况下调用成员函数 std::string class::function()