2

据我了解,scoped_connections 旨在在超出范围时自动断开连接,而不是之前。我发现当 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 上对此进行了测试。)

4

2 回答 2

4

scoped_connection没有移动构造函数(还)。所以它不像你想象的那样是可移动的,而是std::move会回退到复制。正如你提到的,你不能复制一个scoped_connection.

于 2013-04-19T08:16:06.593 回答
0

您需要使用emplace_back,push_back副本。

于 2013-04-19T08:22:24.397 回答