boost::asio::spawn не работает с BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT?

После обновления библиотек повышения с 1.71 до 1.74 мой код, который использует boost::asio::spawn(), не компилируется с MSVC2019 (19.25.28612 для x64) с предопределенным макросом BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT. Насколько я знаю, этот макрос предназначен для обратной совместимости, и я должен использовать этот макрос, потому что я использую boost::beast::saved_handler, но он использует рабочие защитные средства исполнителя, которые не определены для предлагаемых стандартных исполнителей.

Более того, мой код успешно компилируется с clang-11 (и определенным BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT).

Вот простой пример кода, который не компилируется с MSVC2019 и Boost.Asio:1.74, но компилируется с Boost.Asio:1.71 (конечно, boost::asio::any_io_executor следует заменить обратно на boost::asio::executor):

#define BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT
#include <boost/asio.hpp>
#include <boost/asio/spawn.hpp>

int main()
{
  boost::asio::io_context ctx;
  boost::asio::any_io_executor executor = ctx.get_executor();
  boost::asio::spawn(executor, [](auto yield){});
  return 0;
}

со следующим выводом:

C:\local\boost_1_74_0\boost/asio/execution/execute.hpp(192): error C2672: 'boost::asio::strand<Executor>::execute': no matching overloaded function found
        with
        [
            Executor=boost::asio::executor
        ]
C:\local\boost_1_74_0\boost/asio/impl/dispatch.hpp(57): note: see reference to function template instantiation 'void asio_execution_execute_fn::impl::operator ()<boost::asio::strand<Executor>,boost::asio::detail::spawn_helper<handler_type,function_type>&>(T &&,F) noexcept(false) const' being compiled
        with
        [
            Executor=boost::asio::executor,
            T=boost::asio::strand<boost::asio::executor>,
            F=boost::asio::detail::spawn_helper<handler_type,function_type> &
        ]
C:\local\boost_1_74_0\boost/asio/async_result.hpp(151): note: see reference to function template instantiation 'void boost::asio::detail::initiate_dispatch::operator ()<boost::asio::detail::spawn_helper<handler_type,function_type>&>(CompletionHandler,void *) const' being compiled
        with
        [
            CompletionHandler=boost::asio::detail::spawn_helper<handler_type,function_type> &
        ]
C:\local\boost_1_74_0\boost/asio/async_result.hpp(363): note: see reference to function template instantiation 'boost::asio::async_result<boost::asio::detail::spawn_helper<handler_type,function_type>,Signature>::return_type boost::asio::async_result<boost::asio::detail::spawn_helper<handler_type,function_type>,Signature>::initiate<Initiation,boost::asio::detail::spawn_helper<handler_type,function_type>&,>(Initiation &&,RawCompletionToken)' being compiled
        with
        [
            Signature=void (void),
            Initiation=boost::asio::detail::initiate_dispatch,
            RawCompletionToken=boost::asio::detail::spawn_helper<handler_type,function_type> &
        ]
C:\local\boost_1_74_0\boost/asio/async_result.hpp(364): note: see reference to function template instantiation 'boost::asio::async_result<boost::asio::detail::spawn_helper<handler_type,function_type>,Signature>::return_type boost::asio::async_result<boost::asio::detail::spawn_helper<handler_type,function_type>,Signature>::initiate<Initiation,boost::asio::detail::spawn_helper<handler_type,function_type>&,>(Initiation &&,RawCompletionToken)' being compiled
        with
        [
            Signature=void (void),
            Initiation=boost::asio::detail::initiate_dispatch,
            RawCompletionToken=boost::asio::detail::spawn_helper<handler_type,function_type> &
        ]
C:\local\boost_1_74_0\boost/asio/impl/dispatch.hpp(212): note: see reference to function template instantiation 'void boost::asio::async_initiate<CompletionToken,void(void),boost::asio::detail::initiate_dispatch,>(Initiation &&,CompletionToken)' being compiled
        with
        [
            CompletionToken=boost::asio::detail::spawn_helper<handler_type,function_type> &,
            Initiation=boost::asio::detail::initiate_dispatch
        ]
C:\local\boost_1_74_0\boost/asio/impl/spawn.hpp(452): note: see reference to function template instantiation 'void boost::asio::dispatch<boost::asio::detail::spawn_helper<handler_type,function_type>&>(CompletionToken)' being compiled
        with
        [
            CompletionToken=boost::asio::detail::spawn_helper<handler_type,function_type> &
        ]
C:\local\boost_1_74_0\boost/asio/impl/spawn.hpp(493): note: see reference to function template instantiation 'void boost::asio::spawn<boost::asio::executor_binder<void (__cdecl *)(void),boost::asio::strand<Executor>>,Function>(Handler &&,Function &&,const boost::coroutines::attributes &,void *)' being compiled
        with
        [
            Executor=boost::asio::executor,
            Function=main::<lambda_c142a977195366454fba7e579637857b>,
            Handler=boost::asio::executor_binder<void (__cdecl *)(void),boost::asio::strand<boost::asio::executor>>
        ]
C:\local\boost_1_74_0\boost/asio/impl/spawn.hpp(483): note: see reference to function template instantiation 'void boost::asio::spawn<Function,Executor>(const boost::asio::strand<Executor> &,Function &&,const boost::coroutines::attributes &)' being compiled
        with
        [
            Function=main::<lambda_c142a977195366454fba7e579637857b>,
            Executor=boost::asio::executor
        ]
C:\Users\Artem Suleimanov\CLionProjects\test\main.cpp(10): note: see reference to function template instantiation 'void boost::asio::spawn<main::<lambda_c142a977195366454fba7e579637857b>,boost::asio::executor>(const Executor &,Function &&,const boost::coroutines::attributes &,void *)' being compiled
        with
        [
            Executor=boost::asio::executor,
            Function=main::<lambda_c142a977195366454fba7e579637857b>
        ]
C:\local\boost_1_74_0\boost/asio/execution/execute.hpp(192): error C2893: Failed to specialize function template 'enable_if<boost::asio::execution::can_execute<const Executor&,Function>::value,void>::type boost::asio::strand<Executor>::execute(Function &&) const'
        with
        [
            Executor=boost::asio::executor
        ]
C:\local\boost_1_74_0\boost/asio/strand.hpp(276): note: see declaration of 'boost::asio::strand<Executor>::execute'
        with
        [
            Executor=boost::asio::executor
        ]
C:\local\boost_1_74_0\boost/asio/execution/execute.hpp(192): note: With the following template arguments:
C:\local\boost_1_74_0\boost/asio/execution/execute.hpp(192): note: 'Function=boost::asio::detail::spawn_helper<handler_type,function_type> &'

Это ошибка компилятора/буста или я что-то не так делаю?


person Nevermore    schedule 02.12.2020    source источник
comment
Я думаю, что это действительно проблема конкретной платформы. Я мало что могу сказать, потому что онлайн-компиляторы, похоже, не имеют 1.74.0 godbolt.org/z/sPsa8Y. Кстати. похоже, вы использовали executor, а не any_io_executor для сообщения, хотя это было 1,74. Не уверен, что это намеренно / имеет значение   -  person sehe    schedule 03.12.2020
comment
Когда BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT включено, executor == any_io_executor, это просто определение типа.   -  person Nevermore    schedule 03.12.2020


Ответы (1)


Похоже, что эта проблема была исправлена. Я применил патч, и теперь код компилируется MSVC2019.

Запись примечаний к выпуску для этого исправления:

  • Исправлена ​​strand<> адаптация исполнителей Networking TS при работе с более старыми версиями C++ или менее совместимыми компиляторами.
person Nevermore    schedule 03.12.2020