据我了解,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_connection
在vector
内部无法正常工作的实际原因是什么,这是一个可以在boost中修复的问题。
(我在gcc版本4.8.0上使用boost版本1.53.0进行了测试。)
答案 0 :(得分:4)
scoped_connection没有移动构造函数(还)。所以它不能像你想象的那样移动,相反std::move
会后退复制。正如您所提到的,您无法复制scoped_connection
。
答案 1 :(得分:0)
您需要使用emplace_back
,push_back
份副本。