据我了解,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
内无法正常工作的实际原因是什么,这个问题是否可以在 boost 中修复。
(我在 gcc 版本 4.8.0 和 boost 版本 1.53.0 上进行了测试。)
最佳答案
scoped_connection还没有移动构造函数。因此它不可像您假设的那样移动,相反 std::move
将回退到复制。正如您所提到的,您无法在 scoped_connection
周围进行复制。
关于c++ - boost::signals::scoped_connection 在 std::vector 中不起作用。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16100180/