Boost :: сигналы :: scoped_connection не работает в std :: vector. Зачем?

Как я понимаю, 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.)

2

Решение

scoped_connection не имеет конструктора перемещения (пока). Так что он не подвижен, как вы предполагаете, вместо этого std::move будет отступать, чтобы скопировать. И, как вы упомянули, вы не можете копировать вокруг scoped_connection,

4

Другие решения

Вам нужно использовать emplace_back, push_back копии.

0

По вопросам рекламы [email protected]