据我了解,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
在 a 中不能正常工作的实际原因是什么vector
,这是一个可以在 boost.xml 中解决的问题吗?
(我在 gcc 版本 4.8.0 和 boost 版本 1.53.0 上对此进行了测试。)