【发布时间】:2016-06-08 18:07:20
【问题描述】:
根据http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/reference/Handler.html,提供给io_service::post 的处理程序必须是可复制构造的。
但是,这不包括接受套接字并移动响应处理程序的情况,保证只有一个处理程序用于该作业:
auto socket = std::make_unique<socket>();
accepter.accept(*socket);
service.post([s{std::move(socket)}] {
asio::write(*s, buffer("response"), ignored_err);
});
那么为什么这个副本是可构造的要求呢?
-- 编辑--
澄清:我想让我的代码确保只存在一个处理程序实例。这使得推理变得容易得多。
对于很多程序来说,CopyConstructible 要求太严格,MoveConstructible 更合适。
auto i = std::make_unique<int>();
auto handler_w_resource = [i{std::move(i)}]{ ++(*i);};
// auto copied = handler_w_resource; --> +1: lambda can't be copied!
auto moved = std::move(handler_w_resource);
因此我很惊讶它无法搬进来:
service.post(std::move(moved)); // :( post accepts no rvalue
【问题讨论】:
-
唯一指针有效吗? Tbh 我还没有测试我的 1.60 版本,但至少在 1.56 之前,套接字必须在共享指针中......
-
独立ASIO是否需要?一段时间以来,我一直在 C++11 标准中使用独立的 ASIO,并且一些仅限 C++11 的特权,例如 move-semantics 和 std::function,就像我期望的那样工作。可能需要复制可构造性,因为 boost::asio 必须支持 C++03,并且说“如果 C++03 可复制构造,但仅在 C++11 时才需要移动构造”可能太复杂了。只是猜测,我不确定。
-
似乎他们通过 boost v1.67 reference 降低了对 Handler 的 MoveConstructible 的要求
标签: c++ boost boost-asio move-semantics