読者です 読者をやめる 読者になる 読者になる

ゆとりーなの日記

日記的な事を書いて行くと思はれる

Boost.Signals2のtrackableが案外危ないかも

 Boost先生のシグナルを使うときによくお世話になっているtrackableなのですが、moveと組み合わせると危ないのではないかという気がしてきたので試したら案の定クラッシュしました。

#include <iostream>
#include <memory>
#include <boost/signals2/signal.hpp>
#include <boost/signals2/trackable.hpp>

struct hoge : boost::signals2::trackable {
  hoge() : p_(new int()) {}

  hoge(hoge &&rhs) : p_(std::move(rhs.p_)) {}

  void foo() {
    std::cout << *p_ << std::endl;
  }

  std::unique_ptr<int> p_;
};

boost::signals2::signal<void ()> signal;

int main() {
  hoge a;
  signal.connect(boost::bind(&hoge::foo, &a));
  hoge b = std::move(a);
  signal();
  return 0;
}

 moveに関する記述はどこにも書いてないですしまぁ残当と言ったら残当なのですが、個人的にはmoveしたらmove元は接続が切れて新しいmove先が再接続するみたいな挙動になってくれるとうれしいのですが・・・。