Boost.Process v2中自定义on_setup钩子未触发及模板替换失败问题咨询
Boost.Process v2中自定义on_setup钩子未触发及模板替换失败问题咨询
我在使用Boost.Process v2的v2::posix::default_launcher时遇到了一个问题:我定义的自定义on_setup回调函数没有被触发,导致代码中的断言失败。
测试代码
#include <boost/filesystem.hpp> #include <boost/process/v2.hpp> #include <boost/asio.hpp> #include <cassert> namespace sys = boost::system; namespace v2 = boost::process::v2; namespace fs = boost::filesystem; namespace asio = boost::asio; using launcher_type = v2::posix::default_launcher; using pathname_type = fs::path; using args_type = char* const*; const fs::path null_cmd = v2::environment::find_executable("true"); std::initializer_list<std::string> args{}; size_t last_local_event = 0; struct hooks { sys::error_code on_setup(launcher_type &, const pathname_type &, const args_type &) { last_local_event = 1; return sys::error_code{}; } }; auto main() -> int { asio::io_context context; sys::error_code ec{}; launcher_type launch{}; hooks init{}; v2::process p = launch( context, ec, null_cmd, args, std::move(init) ); context.run(); p.wait(ec); assert(last_local_event == 1); // 断言失败,last_local_event始终为0 }
问题详情
我原本认为,通过std::move(init)将自定义hooks实例传递给launcher的调用后,on_setup回调应该会在launcher的初始化阶段被替换并执行。我对照了Boost.Process的源码,觉得自己的on_setup函数签名完全匹配v2::posix::default_launcher期望的回调签名,但实际运行时last_local_event并未被设置为1,说明回调根本没有被调用。
排查与更新
后来我测试了两种修改后的签名,这两种情况下on_setup都能正常触发:
- 使用模板化的launcher参数:
struct hooks { template <typename L> sys::error_code on_setup(L&, const pathname_type&, const char*const*&) { last_local_event = 1; return sys::error_code{}; } };
- 直接指定launcher类型和
const char*const*&作为参数:
struct hooks { sys::error_code on_setup(launcher_type&, const pathname_type&, const char*const*&) { last_local_event = 1; return sys::error_code{}; } };
核心疑问
我定义了args_type = char* const*;,然后在on_setup中使用const args_type&作为参数类型,为什么这会导致模板替换失败?看起来const args_type&和const char*const*&应该是等价的,但实际却不是。这是不是和C语言风格的指针/数组类型的const修饰规则有关?另外,有没有更通用的写法(比如跨平台)来避免这个问题?
我已经在Clang 20(C20)和GCC 13.2.0(C2b)环境下测试过,结果一致。另外我是用-isystem包含Boost头文件的,可能错过了一些编译器的警告信息,这会不会和签名不匹配导致的SFINAE有关?
内容来源于stack exchange
相关产品推荐
相关产品推荐

