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

标签 c++ boost boost-signals

据我了解,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_connectionvector 内无法正常工作的实际原因是什么,这个问题是否可以在 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/

相关文章:

c++ - 指向字符串的指针在函数中如何工作?

c++ - 打开CV : count pixel from the left edge of the image

c++ - 将 Boost Spirit 解析器从 boost::variant 转换为 std::variant

c++ - boost::asio udp - 如何填充多个可变缓冲区?

c++ - 如何从循环中的 vector 调用 shared_ptr<boost::signal>?

c++ - boost::signal<event> dtor 中的程序崩溃

c++ - 使用内置函数(或任何其他方法)在 C++ 中对二维数组进行排序?

c++ - *** 检测到 glibc *** ... : free(): invalid next size (normal): . ..*** 在 fclose() 之后;

c++ - boost 变体 : How to model JSON?

c++ - Boost::signals2 - 描述带有插槽的对象