我可以在调用期间从其目标函数中删除std :: function对象吗?

时间:2018-06-03 11:41:23

标签: c++ lambda language-lawyer lifetime std-function

我可以从std::function调用的函数中删除operator()个对象吗?像这样:

#include <functional>
#include <iostream>

int main() {
    std::function<void()>* fn = nullptr;
    fn = new std::function<void()>([&fn](){
        std::cout << "In my lambda\n";
        delete fn;       // Is this undefined behaviour?
        // fn = nullptr; // This definitely *is* undefined behviour!
    });
    (*fn)(); // Call lambda
    return 0;
}

这是真实情况的一个非常简化的版本。真正的代码智能指针而不是显式的newdelete(当然),实际上该函数正在从STL数据结构中删除它。

我对两个问题感兴趣:

  • 根据C ++标准,这绝对不是未定义的行为吗?
  • 实施是否允许这种做法?即使这在理论上是允许的,如果它是如此不寻常的边缘情况,实现可能在实践中崩溃,那么我仍然想避免它!

之前提出的类似问题:

  • 这类似于关于delete this的许多问题(例如Is delete this allowed)。这个问题是不同的,因为它取决于标准的部分以及语言:如果std::function在调用其包含的函数后允许访问任何成员变量,那么这是未定义的行为。
  • 有一两个问题与这个问题更相似(例如std::function delete-itself when during its call?)但是他们似乎很感兴趣,粗略地讲,它是否可能在他们的应用程序中更好而不是C ++标准是否明确允许它。当然,我所看到的答案都没有提到std::function的C ++标准。

0 个答案:

没有答案