Как я понимаю, scoped_connection
Они предназначены для автоматического отключения, когда они выходят за рамки, а не раньше. Я обнаружил, что это не работает правильно, когда 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
требуется только, чтобы элементы были подвижной. (И я ожидаю 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
, и это проблема, которая может быть исправлена в рамках повышения.
(Я проверял это на gcc версии 4.8.0 с надстройкой версии 1.53.0.)
scoped_connection не имеет конструктора перемещения (пока). Так что он не подвижен, как вы предполагаете, вместо этого std::move
будет отступать, чтобы скопировать. И, как вы упомянули, вы не можете копировать вокруг scoped_connection
,
Вам нужно использовать emplace_back
, push_back
копии.