【发布时间】:2018-06-18 05:02:10
【问题描述】:
std::coroutine_handle 是 C++20 新协程的重要组成部分。例如,生成器经常(总是?)使用它。在我见过的所有示例中,句柄都是在协程的析构函数中手动销毁的:
struct Generator {
// Other stuff...
std::coroutine_handle<promise_type> ch;
~Generator() {
if (ch) ch.destroy();
}
}
这真的有必要吗?如果是,为什么coroutine_handle 还没有完成这项工作,是否存在具有这种行为方式的coroutine_handle 的RAII 版本,如果我们省略destroy 调用会发生什么?
例子:
- https://en.cppreference.com/w/cpp/coroutine/coroutine_handle(谢谢463035818_is_not_a_number)
- C++20 标准还在 9.5.4.10 示例 2 中提到它(在 N4892 上检查)。
- (德语)https://www.heise.de/developer/artikel/Ein-unendlicher-Datenstrom-dank-Coroutinen-in-C-20-5991142.html
-
https://www.scs.stanford.edu/~dm/blog/c++-coroutines.html - 提到如果不调用它会泄漏,但没有引用标准中的段落或为什么不在
std::coroutine_handle的析构函数中调用它。
【问题讨论】:
-
嗯,在我见过的所有示例中,它从未在任何协程的析构函数中手动销毁...
-
@Fureeish 提问哪些例子更好。
-
@463035818_is_not_a_number 实际上甚至 C++20 标准(我查看了 n4892,但我猜真正的版本也有类似的措辞)包括它。见 9.5.4.10。
-
我在这里找到了一个示例 en.cppreference.com/w/cpp/coroutine/coroutine_handle。不过,我认为您应该在问题中引用一个示例,以便其他人知道您在说什么
-
根据我在 CPPwinrt 方面的经验......这取决于。如果您使用的是生成器,则需要调用destroy。如果你不是,那么没有。但我不会认为这是权威的。编辑cppcoro 有一些合适的例子。