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
相关产品推荐
相关产品推荐

