Open tusooa opened 2 years ago
The minimal source to reproduce this:
#include <boost/asio.hpp>
int main()
{
boost::asio::io_context io;
auto g = boost::asio::executor_work_guard(io.get_executor());
}
Result:
] c++ asio-test.cpp
asio-test.cpp: In function ‘int main()’:
asio-test.cpp:6:64: error: class template argument deduction failed:
6 | auto g = boost::asio::executor_work_guard(io.get_executor());
| ^
asio-test.cpp:6:64: error: no matching function for call to ‘executor_work_guard(boost::asio::io_context::executor_type)’
In file included from /usr/include/boost/asio/detail/handler_work.hpp:27,
from /usr/include/boost/asio/detail/completion_handler.hpp:21,
from /usr/include/boost/asio/impl/io_context.hpp:18,
from /usr/include/boost/asio/io_context.hpp:1530,
from /usr/include/boost/asio/detail/io_object_impl.hpp:23,
from /usr/include/boost/asio/basic_socket.hpp:22,
from /usr/include/boost/asio/basic_datagram_socket.hpp:20,
from /usr/include/boost/asio.hpp:26,
from asio-test.cpp:1:
/usr/include/boost/asio/executor_work_guard.hpp:34:7: note: candidate: ‘template<class Executor, class, class> executor_work_guard()-> boost::asio::executor_work_guard<Executor, <template-parameter-1-2>, <template-parameter-1-3> >’
34 | class executor_work_guard;
| ^~~~~~~~~~~~~~~~~~~
/usr/include/boost/asio/executor_work_guard.hpp:34:7: note: template argument deduction/substitution failed:
asio-test.cpp:6:64: note: candidate expects 0 arguments, 1 provided
6 | auto g = boost::asio::executor_work_guard(io.get_executor());
| ^
In file included from /usr/include/boost/asio/detail/handler_work.hpp:27,
from /usr/include/boost/asio/detail/completion_handler.hpp:21,
from /usr/include/boost/asio/impl/io_context.hpp:18,
from /usr/include/boost/asio/io_context.hpp:1530,
from /usr/include/boost/asio/detail/io_object_impl.hpp:23,
from /usr/include/boost/asio/basic_socket.hpp:22,
from /usr/include/boost/asio/basic_datagram_socket.hpp:20,
from /usr/include/boost/asio.hpp:26,
from asio-test.cpp:1:
/usr/include/boost/asio/executor_work_guard.hpp:34:7: note: candidate: ‘template<class Executor, class, class> executor_work_guard(boost::asio::executor_work_guard<Executor, <template-parameter-1-2>, <template-parameter-1-3> >)-> boost::asio::executor_work_guard<Executor, <template-parameter-1-2>, <template-parameter-1-3> >’
34 | class executor_work_guard;
| ^~~~~~~~~~~~~~~~~~~
/usr/include/boost/asio/executor_work_guard.hpp:34:7: note: template argument deduction/substitution failed:
asio-test.cpp:6:64: note: ‘boost::asio::io_context::basic_executor_type<std::allocator<void>, 0>’ is not derived from ‘boost::asio::executor_work_guard<Executor, <template-parameter-1-2>, <template-parameter-1-3> >’
6 | auto g = boost::asio::executor_work_guard(io.get_executor());
|
Changing to auto g = boost::asio::make_work_guard(io.get_executor());
will not result in a compiler error. But why does the original method fail?
Environment:
Output:
Source: https://lily-is.land/kazv/libkazv/-/blob/servant/src/job/cprjobhandler.cpp#L269 https://lily-is.land/kazv/libkazv/-/blob/servant/src/job/cprjobhandler.cpp#L105 :
boost::asio::io_context::executor_type executor;