在调用过程中,是否要销毁/删除std :: function是未定义的行为?
class Event {
public:
Event(std::function<void()> f) : func(std::move(f)) {}
~Event() {}
std::function<void()> func;
};
int main()
{
std::vector<Event> events;
auto func = [&]() {
events.pop_back();
std::cout << "event" << std::endl;
// do more work
};
events.emplace_back(std::move(func));
events[0].func();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是[res.on.objects] p2未定义的:
如果访问标准库类型的对象,并且在访问之前未发生对象生命周期的开始,或者在对象生命周期结束之前未发生访问,则除非另行指定,否则行为是未定义的.
在这种情况下,"访问"包括对函数调用操作符的调用std::function.该std::function对象的生命周期在结束pop_back()通话,在访问中间.因此,访问不会在对象生命周期结束之前发生,并且行为未定义.