C++/WinRTにおける微妙なinvoke問題とその解決策

2025-03-09
C++/WinRTにおける微妙なinvoke問題とその解決策

C++/WinRTのプルリクエストにより、`winrt::impl::promise_base::set_completed`における`invoke`の呼び出しの曖昧さが修正されました。これは、引数依存名検索(ADL)が原因でした。C++20のコルーチンのアップグレードによってADLの検索範囲が広がり、意図した`winrt::impl::invoke`ではなく`std::invoke`が誤って検出されました。この記事ではADLのメカニズムを詳しく説明し、古いバージョンのC++/WinRTに対する修正プログラムを提供します。`winrt::Windows::Foundation`名前空間に、より適切に一致する`invoke`関数を宣言することで、コンパイラを正しい関数に誘導します。この修正プログラムには、C++/WinRTのアップグレード後に自動的に無効になる静的アサーションも含まれています。

開発