我可以从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;
}
这是真实情况的一个非常简化的版本。真正的代码智能指针而不是显式的new
和delete
(当然),实际上该函数正在从STL数据结构中删除它。
我对两个问题感兴趣:
之前提出的类似问题:
delete this
的许多问题(例如Is delete this allowed)。这个问题是不同的,因为它取决于标准的库部分以及语言:如果std::function
在调用其包含的函数后允许访问任何成员变量,那么这是未定义的行为。std::function
的C ++标准。