Boost 信号引用对象超出范围?

Boost Signal References Object Out of Scope?

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));

...
}

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

它复制并保留它。

你对 boost::bind 的结果被要求构造一个 slot_type 并将其存储为成员,然后一旦它传递给 signal::connect 信号就会存储 slot_type,这意味着您的 bind 结果的副本存储在 signal 中,这是信号触发时使用和调用的结果。

我找不到明确明确说明这一点的地方,但你或多或少可以得出结论: