Subtiles C++/WinRT Invoke-Problem und dessen Lösung

2025-03-09
Subtiles C++/WinRT Invoke-Problem und dessen Lösung

Ein Pull Request von C++/WinRT behob eine Mehrdeutigkeit beim Aufruf von `invoke` in `winrt::impl::promise_base::set_completed`, verursacht durch Argument-abhängiges Lookup (ADL). Das Upgrade auf C++20-Coroutinen erweiterte den ADL-Suchraum und fand unerwartet `std::invoke` statt des beabsichtigten `winrt::impl::invoke`. Der Artikel beschreibt den ADL-Mechanismus und bietet einen Patch für ältere C++/WinRT-Versionen: die Deklaration einer besser passenden `invoke`-Funktion im Namensraum `winrt::Windows::Foundation`, um den Compiler anzuleiten. Dieser Patch enthält auch eine statische Assertion, um sicherzustellen, dass er nach dem Upgrade von C++/WinRT automatisch entfernt wird.

Entwicklung