2

私が理解しているように、scoped_connections は、範囲外になる前ではなく、範囲外になったときに自動的に切断されることを意図しています。scoped_connection が入っていると、これが正しく機能しないことがわかりましたstd::vector(おそらく、他のコンテナーでも失敗します)。

例えば。

using boost::signals::scoped_connection; // just for readability
boost::signal<void ()> sig;
std::vector<scoped_connection> connection_vec;

connection_vec.push_back(sig.connect(foo));
assert(connection_vec.back().connected()); // this assertion fails!

std::vectorこれは、要素がコピー可能であるのに対し、コピー不可である必要があると主張することで説明されているのを見てきましたが、それscoped_connectionは完全に真実ではありません。std::vector要素がmoveableであることのみが必要です。scoped_connection(そして、私は移動可能であるべきだと思っています。)

たとえば、次のコードは機能します。

std::vector<std::unique_ptr<scoped_connection>> vec2;
// Note that std::unique_ptr is uncopyable, but moveable

vec2.push_back(std::unique_ptr<scoped_connection>(new scoped_connection(sig.connect(foo))));
assert((*vec2.back()).connected()); // this assertion succeeds!

std::vectorさらに、コピーできないものをコピーしようとして問題が発生した場合、コンパイル エラーが発生するのではないでしょうか。

だから私は、scoped_connection内部で正しく動作しない実際の理由は何だろうと思っていvectorます.これはブースト内で修正できる問題ですか.

(ブーストバージョン 1.53.0 を使用して gcc バージョン 4.8.0 でこれをテストしました。)

4

2 に答える 2

0

emplace_backpush_backコピーを使用する必要があります。

于 2013-04-19T08:22:24.397 に答える