在调用过程中删除std :: function

Moz*_*zbi 6 c++ c++11 c++14

在调用过程中,是否要销毁/删除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)

T.C*_*.C. 6

这是[res.on.objects] p2未定义的:

如果访问标准库类型的对象,并且在访问之前未发生对象生命周期的开始,或者在对象生命周期结束之前未发生访问,则除非另行指定,否则行为是未定义的.

在这种情况下,"访问"包括对函数调用操作符的调用std::function.该std::function对象的生命周期在结束pop_back()通话,在访问中间.因此,访问不会在对象生命周期结束之前发生,并且行为未定义.