【发布时间】:2023-02-24 13:47:49
【问题描述】:
来自 C++/WinRT docs
IASyncAction DoWorkAsync(Param const& value) {
auto safe_value = value;
// It's ok to access both safe_value and value here.
co_await DoOtherWorkAsync();
// It's ok to access only safe_value here (not value).
}
这是有道理的,只是一个悬而未决的参考。然而,在过去我发现我不得不这样做。
IASyncAction DoWorkAsync(Param value) {
auto safe_value = value;
// It's ok to access both value here.
co_await DoOtherWorkAsync();
// It's ok to access only safe_value here (not value).
}
刚才我花了太多时间调试才发现又是这个问题。
IASyncAction DoWorkAsync(Param&& value) {
co_await DoOtherWorkAsync(); // value deconstructor called
some_function(std::move(value)); // BOOM
}
这应该发生吗?文档没有提到它。这是怎么回事?
【问题讨论】:
-
这不是特定于协程的。发生的事情是您已经获取了一个引用参数,控制权已传递给一些破坏底层对象的代码,现在您遇到了问题。无论有没有协程,这都可能发生。我也对你的第二个例子感到困惑:一个按值参数存在于协程状态中并且不应该变得无效,除非它包含对其他无效对象的引用/指针。应该没有必要制作一个
safe_value,如果出现问题,使用一个可能无济于事。
标签: c++ coroutine c++-winrt c++-coroutine