【问题标题】:Coroutine Parameter lifetimes协程参数生命周期
【发布时间】: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


【解决方案1】:

右值引用是参考;除了可以从纯右值(如const&)显示临时值这一事实之外,它们没有任何特殊的权力来管理生命周期。

至于值参数,那完全取决于对象是什么正在做.协程已经在内部存储了参数的副本。您在协程开始时再次复制它只有在该副本保留一些资源的情况下才有意义原来的复制不会。这取决于参数的类型。

【讨论】:

    猜你喜欢
    • 2021-06-28
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 2020-06-20
    • 2021-12-20
    • 2013-04-06
    • 2019-06-26
    • 1970-01-01
    相关资源
    最近更新 更多