You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MSVC下结合/std:c++20与v143工具链编译Boost.Asio失败求助

Boost.Asio编译错误:VS2022 v143 + C++20组合下的问题解决思路

问题背景

在Visual Studio 17.12.4中,使用v143工具链并开启/std:c++20(或更高版本)编译极简Boost.Asio程序时失败,但切换到v142工具链或更低版本的C++标准则可正常编译。使用的Boost版本为1.84.0。

极简复现代码

#include <SDKDDKVer.h>
#include <boost/asio.hpp>

auto main() -> int
{
   boost::asio::io_context ctx;
   boost::asio::serial_port p(ctx);
   return 0;
}

编译错误信息

------ Build started: Project: sandbox, Configuration: Debug x64 ------
main.cpp
c:\vcpkg_dir\include\boost\asio\detail\io_object_impl.hpp(59,16): error C2665: 'boost::asio::any_io_executor::any_io_executor': no overloaded function could convert all the argument types
(compiling source file 'main.cpp')
    c:\vcpkg_dir\include\boost\asio\impl\any_io_executor.ipp(34,18):
    could be 'boost::asio::any_io_executor::any_io_executor(std::nullptr_t) noexcept'
        c:\vcpkg_dir\include\boost\asio\detail\io_object_impl.hpp(59,16):
        'boost::asio::any_io_executor::any_io_executor(std::nullptr_t) noexcept': cannot convert argument 1 from 'boost::asio::io_context::executor_type' to 'std::nullptr_t'
            c:\vcpkg_dir\include\boost\asio\detail\io_object_impl.hpp(59,37):
            No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
    c:\vcpkg_dir\include\boost\asio\any_io_executor.hpp(184,3):
    or       'boost::asio::any_io_executor::any_io_executor(std::nothrow_t,Executor,constraint<conditional_t<!std::is_same<OtherAnyExecutor,boost::asio::any_io_executor>::value&&!std::is_base_of<boost::asio::execution::detail::any_executor_base,Executor>::value,boost::asio::execution::detail::is_valid_target_executor<Executor,boost::asio::any_io_executor::supportable_properties_type>,std::false_type>::value,int>::type) noexcept'
        c:\vcpkg_dir\include\boost\asio\detail\io_object_impl.hpp(59,16):
        'boost::asio::any_io_executor::any_io_executor(std::nothrow_t,Executor,constraint<conditional_t<!std::is_same<OtherAnyExecutor,boost::asio::any_io_executor>::value&&!std::is_base_of<boost::asio::execution::detail::any_executor_base,Executor>::value,boost::asio::execution::detail::is_valid_target_executor<Executor,boost::asio::any_io_executor::supportable_properties_type>,std::false_type>::value,int>::type) noexcept': expects 3 arguments - 1 provided
    c:\vcpkg_dir\include\boost\asio\any_io_executor.hpp(162,3):
    or       'boost::asio::any_io_executor::any_io_executor(Executor,constraint<conditional_t<!std::is_same<OtherAnyExecutor,boost::asio::any_io_executor>::value&&!std::is_base_of<boost::asio::execution::detail::any_executor_base,Executor>::value,boost::asio::execution::detail::is_valid_target_executor<Executor,boost::asio::any_io_executor::supportable_properties_type>,std::false_type>::value,int>::type)'
        c:\vcpkg_dir\include\boost\asio\detail\io_object_impl.hpp(59,16):
        Failed to specialize function template 'boost::asio::any_io_executor::any_io_executor(Executor,constraint<conditional_t<!std::is_same<OtherAnyExecutor,boost::asio::any_io_executor>::value&&!std::is_base_of<boost::asio::execution::detail::any_executor_base,Executor>::value,boost::asio::execution::detail::is_valid_target_executor<Executor,boost::asio::any_io_executor::supportable_properties_type>,std::false_type>::value,int>::type)'
            c:\vcpkg_dir\include\boost\asio\detail\io_object_impl.hpp(59,16):
            With the following template arguments:
                c:\vcpkg_dir\include\boost\asio\detail\io_object_impl.hpp(59,16):
                'Executor=boost::asio::io_context::executor_type'
            c:\vcpkg_dir\include\boost\asio\any_io_executor.hpp(163,7):
            'boost::asio::constraint_t' : Failed to specialize alias template
                c:\vcpkg_dir\include\boost\asio\detail\type_traits.hpp(169,60):
                'type': is not a member of any direct or indirect base class of 'boost::asio::constraint<false,int>'
    c:\vcpkg_dir\include\boost\asio\any_io_executor.hpp(132,3):
    or       'boost::asio::any_io_executor::any_io_executor(std::nothrow_t,OtherAnyExecutor,constraint<conditional_t<!std::is_same<OtherAnyExecutor,boost::asio::any_io_executor>::value&&std::is_base_of<boost::asio::execution::detail::any_executor_base,Executor>::value,boost::asio::execution::detail::supportable_properties<0,void (boost::asio::execution::context_as_t<boost::asio::execution_context &>,boost::asio::execution::detail::blocking::never_t<0>,boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0>>)>::is_valid_target<OtherAnyExecutor>,std::false_type>::value,int>::type) noexcept'
        c:\vcpkg_dir\include\boost\asio\detail\io_object_impl.hpp(59,16):
        'boost::asio::any_io_executor::any_io_executor(std::nothrow_t,OtherAnyExecutor,constraint<conditional_t<!std::is_same<OtherAnyExecutor,boost::asio::any_io_executor>::value&&std::is_base_of<boost::asio::execution::detail::any_executor_base,Executor>::value,boost::asio::execution::detail::supportable_properties<0,void (boost::asio::execution::context_as_t<boost::asio::execution_context &>,boost::asio::execution::detail::blocking::never_t<0>,boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0>>)>::is_valid_target<OtherAnyExecutor>,std::false_type>::value,int>::type) noexcept': expects 3 arguments - 1 provided
    c:\vcpkg_dir\include\boost\asio\any_io_executor.hpp(108,3):
    or       'boost::asio::any_io_executor::any_io_executor(OtherAnyExecutor,constraint<conditional_t<!std::is_same<OtherAnyExecutor,boost::asio::any_io_executor>::value&&std::is_base_of<boost::asio::execution::detail::any_executor_base,Executor>::value,boost::asio::execution::detail::supportable_properties<0,void (boost::asio::execution::context_as_t<boost::asio::execution_context &>,boost::asio::execution::detail::blocking::never_t<0>,boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0>>)>::is_valid_target<OtherAnyExecutor>,std::false_type>::value,int>::type)'
        c:\vcpkg_dir\include\boost\asio\detail\io_object_impl.hpp(59,16):
        Failed to specialize function template 'boost::asio::any_io_executor::any_io_executor(OtherAnyExecutor,constraint<conditional_t<!std::is_same<OtherAnyExecutor,boost::asio::any_io_executor>::value&&std::is_base_of<boost::asio::execution::detail::any_executor_base,Executor>::value,boost::asio::execution::detail::supportable_properties<0,void (boost::asio::execution::context_as_t<boost::asio::execution_context &>,boost::asio::execution::detail::blocking::never_t<0>,boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0>>)>::is_valid_target<OtherAnyExecutor>,std::false_type>::value,int>::type)'
            c:\vcpkg_dir\include\boost\asio\detail\io_object_impl.hpp(59,16):
            With the following template arguments:
                c:\vcpkg_dir\include\boost\asio\detail\io_object_impl.hpp(59,16):
                'OtherAnyExecutor=boost::asio::io_context::executor_type'
            c:\vcpkg_dir\include\boost\asio\any_io_executor.hpp(109,7):
            'boost::asio::constraint_t' : Failed to specialize alias template
                c:\vcpkg_dir\include\boost\asio\detail\type_traits.hpp(169,60):
                'type': is not a member of any direct or indirect base class of 'boost::asio::constraint<false,int>'
    c:\vcpkg_dir\include\boost\asio\detail\io_object_impl.hpp(59,16):
    while trying to match the argument list '(boost::asio::io_context::executor_type)'
    c:\vcpkg_dir\include\boost\asio\detail\io_object_impl.hpp(59,16):
    the template instantiation context (the oldest one first) is
        C:\Users\me\source\repos\sandbox\sandbox\main.cpp(21,31):
        see reference to function template instantiation 'boost::asio::basic_serial_port<boost::asio::any_io_executor>::basic_serial_port<boost::asio::io_context>(ExecutionContext &,const char *,int)' being compiled
        with
        [
            ExecutionContext=boost::asio::io_context
        ]
            C:\Users\me\source\repos\sandbox\sandbox\main.cpp(21,31):
            see the first reference to 'boost::asio::basic_serial_port<boost::asio::any_io_executor>::basic_serial_port' in 'main'
        c:\vcpkg_dir\include\boost\asio\basic_serial_port.hpp(158,12):
        see reference to function template instantiation 'boost::asio::detail::io_object_impl<boost::asio::detail::win_iocp_serial_port_service,Executor>::io_object_impl<ExecutionContext>(int,int,ExecutionContext &)' being compiled
        with
        [
            Executor=boost::asio::any_io_executor,
            ExecutionContext=boost::asio::io_context
        ]

解决思路

  • 显式指定Executor类型:将boost::asio::serial_port替换为boost::asio::basic_serial_port<boost::asio::io_context::executor_type>,避免默认使用any_io_executor带来的兼容性问题。修改后的代码片段:
    boost::asio::io_context ctx;
    boost::asio::basic_serial_port<boost::asio::io_context::executor_type> p(ctx);
    
  • 升级Boost版本:Boost 1.85.0及后续版本已修复VS v143工具链与C++20组合下的该兼容性问题,更新Boost到最新稳定版即可解决。
  • 临时编译宏 workaround:在包含Boost.Asio头文件前定义BOOST_ASIO_DISABLE_SERIAL_PORT_POSIX,该宏会禁用POSIX串口相关实现,仅保留Windows平台的IOCP实现,可绕过类型转换错误(仅适用于Windows环境)。
  • 检查vcpkg编译配置:确保通过vcpkg安装的Boost是使用v143工具链编译的,避免混合不同工具链的二进制文件导致的兼容性问题。

内容的提问来源于stack exchange,提问作者Basti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:44:49