【发布时间】:2021-05-15 00:40:14
【问题描述】:
这些存在于我的代码库的其他部分,
namespace net = boost::asio;
using boost::asio::ip::tcp;
boost::asio::io_context& io_context_;
tcp::acceptor acceptor_;
void server::on_accept(boost::beast::error_code ec, boost::asio::ip::tcp::socket socket);
我注意到这段代码可以编译:
auto strand = net::make_strand(io_context_);
std::shared_ptr<server> this_pointer = shared_from_this();
acceptor_.async_accept(
strand,
boost::beast::bind_front_handler(&server::on_accept, this_pointer)
);
而这不是:
auto strand = net::make_strand(io_context_);
std::shared_ptr<server> this_pointer = shared_from_this();
auto call_next = boost::beast::bind_front_handler(&server::on_accept, this_pointer);
acceptor_.async_accept(
strand,
call_next
);
它失败并出现错误
/usr/include/boost/beast/core/detail/bind_handler.hpp:251:45: error: cannot convert ‘boost::beast::detail::bind_front_wrapper<void (server::*)(boost::system::error_code, boost::asio::basic_stream_socket<boost::asio::ip::tcp>), std::shared_ptr<server> >’ to ‘void (server::*)(boost::system::error_code, boost::asio::basic_stream_socket<boost::asio::ip::tcp>)’ in initialization
251 | , args_(std::forward<Args_>(args)...)
我很好奇为什么将 bind_front_handler 返回的值直接传递给 async_accept 会起作用,但将该值存储在变量中然后传递该变量将不起作用。
我现在对 Boost 和 Beast 也知之甚少,但在我看来,我好像忘记了关于 C++ 本身的一些非常基本的东西。为什么这两段代码不等价?
【问题讨论】:
标签: c++ boost stdbind boost-beast