boost :: signals :: scoped_connection在std :: vector中不起作用。为什么?

时间:2013-04-19 08:14:17

标签: c++ boost boost-signals

据我了解,scoped_connection s意味着当它们超出范围时自动断开连接,而不是之前。我发现当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_connectionvector内部无法正常工作的实际原因是什么,这是一个可以在boost中修复的问题。

(我在gcc版本4.8.0上使用boost版本1.53.0进行了测试。)

2 个答案:

答案 0 :(得分:4)

scoped_connection没有移动构造函数(还)。所以它不能像你想象的那样移动,相反std::move会后退复制。正如您所提到的,您无法复制scoped_connection

答案 1 :(得分:0)

您需要使用emplace_backpush_back份副本。