Boost.siangls2 不能 bind ?


#1

直接将 signals2 对象用于 bind 会导致错误.

boost::signals2::signal<void(int)>    test;
boost::function<void()>  testfunc = boost::bind(test, 1);

无法编译.


#2

找到了, 其实是因为 signals 不能被 copy , 所以需要用 boost::ref 包装一下.

#include <boost/signals2.hpp>
#include <boost/bind.hpp>
#include <boost/ref.hpp>

int main(void)
{
  boost::signals2::signal<void(int)> sig;
  boost::function<void()> f = boost::bind(boost::ref(sig), 10);
}

#3

yeah,直接作为bind参数必须是可copy的。 其它你也还可以使用shared_ptr来包装一下。 另外,如果只是使用引用,得注意多线程中sig的生命期,不要成为空引用。


#4

好像 C++11 下就可以 !! 用 std::move ! 启用 move 给移动进去.


#5

在move后,原先的那个对象的析构函数会被调用吗?


#6

移动后的对象会析构, 所以如果对象能移动, 作者要保证避免二次析构成员变量


move语义会不会调用析构函数