c++ - 当绑定(bind)对象过期时,由 std::bind 创建的仿函数的行为是否定义明确?

标签 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?
}

最佳答案

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

如果原始对象的生命周期不如包装器那么长,您始终可以在包装器中存储该对象的拷贝:

f = std::bind(&A::shout, a);
//                      ^^^ copy

关于c++ - 当绑定(bind)对象过期时,由 std::bind 创建的仿函数的行为是否定义明确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37000978/

相关文章:

c++ - 可互换声明的变量具有相同的内存地址模式

C++20 指定初始化器 char[]

c++ - Clang 和 GCC 在解析可变函数模板重载时的不同行为

c++ - const 指针作为 std::bind 参数

c++ - 我怎样才能避免这种代码重复?

c++ - 无法将 std::bind 返回值分配给 std::function

c++ - 如何将参数传递给dll?

c++ - 与智能指针(intrusive_ptr)一起使用的抽象基类-处理继承,多态性,可克隆性以及从工厂方法返回

c++ - 体系结构 x86_64 的 undefined symbol ,链接器命令失败

c++ - 为什么 C++11 没有模板类型定义?