当绑定对象到期时,std :: bind创建的仿函数的行为是否定义良好?

use*_*183 0 c++ language-lawyer stdbind

是否定义了以下代码的行为?f()通话如何表现?

#include <functional>
#include <iostream>

struct A
{
  void shout()
  {
      std::cout <<"shout";
  }
};


int main()
{
    std::function<void()> f;
    {
        A a;
        f = std::bind(&A::shout, &a);
    }

    f();  // what happens here?
}
Run Code Online (Sandbox Code Playgroud)

Ker*_* SB 5

您的代码最终在函数包装器中存储悬空引用(对于不再存在的对象),并且调用该函数会导致未定义的行为.

如果原始对象的存活时间与包装器不同,则始终可以在包装器中存储该对象的副本:

f = std::bind(&A::shout, a);
//                      ^^^ copy
Run Code Online (Sandbox Code Playgroud)