C++ 增压信号引用对象超出范围? typedef boost::signals2::signal-signal\u t; AAA级{ 公众: 无效连接(常数信号:插槽类型和用户) { 返回m_信号连接(用户); } 无效火灾信号() { m_sig(); } 私人: 信号信号; }; //全球的 AAA a; BBB; //一些范围 { ... a、 连接(boost::bind(&BBB:foo,&b)); ... }

C++ 增压信号引用对象超出范围? typedef boost::signals2::signal-signal\u t; AAA级{ 公众: 无效连接(常数信号:插槽类型和用户) { 返回m_信号连接(用户); } 无效火灾信号() { m_sig(); } 私人: 信号信号; }; //全球的 AAA a; BBB; //一些范围 { ... a、 连接(boost::bind(&BBB:foo,&b)); ... },c++,boost,signals2,C++,Boost,Signals2,现在,上一个boost::bind返回的临时对象超出范围并被销毁 但是,临时对象通过引用传递给AAA::Connect。 现在让我们假设在某个时刻,调用了对象a.FireSignal(),该信号是否调用了一个已经被破坏的函数对象???否则它是如何工作的?它会复制并保存它 toboost::bind的结果用于构造一个插槽类型,该插槽类型将其存储为一个成员,然后将其传递给signal::connect后,信号将存储插槽类型,这意味着绑定结果的副本存储在信号中,这是信号触发时使用和调用的副本 我找不到

现在,上一个boost::bind返回的临时对象超出范围并被销毁 但是,临时对象通过引用传递给AAA::Connect。
现在让我们假设在某个时刻,调用了对象a.FireSignal(),该信号是否调用了一个已经被破坏的函数对象???否则它是如何工作的?

它会复制并保存它

to
boost::bind
的结果用于构造一个
插槽类型
,该插槽类型将其存储为一个成员,然后将其传递给
signal::connect
后,信号将存储
插槽类型
,这意味着
绑定
结果的副本存储在
信号
中,这是信号触发时使用和调用的副本

我找不到一个地方具体地说了这句话,但你或多或少可以从以下几点得出结论:


我尝试使用“按引用传递”和“对象传递”。助推信号2崩溃!不知何故,信号丢失了由bind创建的函数对象。@Joseph与bind结果本身相比,您正在使用的实例(
BBB
)更有可能死亡,此外可能还有其他原因,这实际上取决于上下文。
typedef boost::signals2::signal<void ()> signal_t;

class AAA {

public:

void Connect(const signal_t::slot_type& subscriber)
{
    return m_sig.connect(subscriber);
}

void FireSignal()
{
    m_sig();
}   

private:

    signal_t sig;
};

// Global
AAA a;

BBB b;

// Some scope
{
...

a.Connect(boost::bind(&BBB:foo, &b));

...
}