C++/WinRT协程参数需按值传递错误:RNW文件选择器模块求助
解决C++/WinRT协程编译错误C2338的方案
错误原因
编译错误C2338: Coroutine parameter must be passed by value for safe access是C++/WinRT的协程安全检查机制触发的——协程挂起后,外部传入的引用/指针类型参数可能已被销毁,后续访问会导致未定义行为,因此强制要求协程参数必须以值传递。
具体解决方案
- 修改协程参数类型:将所有引用(包括左值引用
const&、右值引用&&)或指针类型的协程参数,改为值传递。比如把IAsyncOperation<StorageFile> PickFileAsync(winrt::hstring const& filter)修改为IAsyncOperation<StorageFile> PickFileAsync(winrt::hstring filter)。 - 处理大对象参数:如果参数是大对象,无需担心拷贝开销——C++/WinRT的核心类型(如
winrt::hstring、StorageFile)都是轻量级智能指针,拷贝成本极低;若自定义大对象,可使用winrt::copyable包装确保安全值传递。 - 检查lambda捕获变量:协程内部若使用lambda捕获外部变量,需将引用捕获改为值捕获,避免协程挂起后出现悬垂引用。
错误代码示例
IAsyncOperation<StorageFile> OpenFilePickerAsync(winrt::hstring const& fileType) { FileOpenPicker picker; picker.FileTypeFilter().Append(fileType); co_return co_await picker.PickSingleFileAsync(); }
修改后正确代码
IAsyncOperation<StorageFile> OpenFilePickerAsync(winrt::hstring fileType) { FileOpenPicker picker; picker.FileTypeFilter().Append(fileType); co_return co_await picker.PickSingleFileAsync(); }
额外注意点
若你的C++/WinRT模块需要和React Native JS层交互,需确保JS层传递的参数在绑定层被正确转换为值类型的C++/WinRT对象,避免绑定过程中出现隐性的引用传递问题。
内容的提问来源于stack exchange,提问作者Jihoo Byeon
相关产品推荐
相关产品推荐

