【发布时间】:2013-04-19 08:14:17
【问题描述】:
据我了解,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 在vector 中无法正常工作的真正原因是什么,这是一个可以在 boost 中解决的问题吗?
(我在 gcc 版本 4.8.0 和 boost 版本 1.53.0 上对此进行了测试。)
【问题讨论】:
-
这是 C++11 吗?或不?你将什么标志传递给
gcc? -
它是 C++11。
g++ -std=c++11 -Wall -DDEBUG -O0 -g
标签: c++ boost boost-signals