C++/WinRT 的一个微妙的调用问题及解决方法
2025-03-09

C++/WinRT 的一个 pull request 修复了 `winrt::impl::promise_base::set_completed` 中由于参数相关查找(ADL)导致的 `invoke` 函数调用歧义问题。由于 C++20 正式支持协程,导致查找范围扩大,意外找到了 `std::invoke`,而非预期的 `winrt::impl::invoke`。文章详细解释了 ADL 机制,并提供了针对旧版 C++/WinRT 的补丁方案:在 `winrt::Windows::Foundation` 命名空间中声明一个更匹配的 `invoke` 函数,从而引导编译器选择正确的函数。此补丁还包含一个静态断言,确保在升级 C++/WinRT 后自动失效。