什么是 noop 协程?
What is a noop coroutine?
C++20 标准在 [coroutine.noop] 中定义了“noop 协程”。它是什么?
它与主体为 { co_return; }
的函数有何不同?
更新
感谢您提供提案和标准的链接。从这些参考资料中总结,“noop 协程”是 resume()
(或 operator()
)和 destroy()
方法没有副作用的协程。
但是 destroy()
在用户编写的协程上总是(我认为!)有副作用,即破坏协程并进一步调用协程句柄方法,包括 resume()
和 destroy()
现在将是未定义的行为,这与无副作用行为不同。
综上所述,没有办法写出 destroy()
没有副作用的协程,只有库提供的 noop 协程才有这个 属性,对吗?
(欢迎更新答案,以回应我问题的这次更新。)
这是在这里提出的:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0913r1.html
基本上,这个想法是
Having such a coroutine handle allows library writer to perform either
symmetric or asymmetric control transfer based on runtime
considerations.
以下代码说明了这个想法(来自同一个提案):
struct Awaiter {
...
auto await_suspend(coroutine_handle<> h) {
...
return cond ? next_coro : noop_coroutine();
}
};
这与手写的 noop 协程不一定不同,但是为您预定义了一个非常方便。
C++20 标准在 [coroutine.noop] 中定义了“noop 协程”。它是什么?
它与主体为 { co_return; }
的函数有何不同?
更新
感谢您提供提案和标准的链接。从这些参考资料中总结,“noop 协程”是 resume()
(或 operator()
)和 destroy()
方法没有副作用的协程。
但是 destroy()
在用户编写的协程上总是(我认为!)有副作用,即破坏协程并进一步调用协程句柄方法,包括 resume()
和 destroy()
现在将是未定义的行为,这与无副作用行为不同。
综上所述,没有办法写出 destroy()
没有副作用的协程,只有库提供的 noop 协程才有这个 属性,对吗?
(欢迎更新答案,以回应我问题的这次更新。)
这是在这里提出的:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0913r1.html
基本上,这个想法是
Having such a coroutine handle allows library writer to perform either symmetric or asymmetric control transfer based on runtime considerations.
以下代码说明了这个想法(来自同一个提案):
struct Awaiter {
...
auto await_suspend(coroutine_handle<> h) {
...
return cond ? next_coro : noop_coroutine();
}
};
这与手写的 noop 协程不一定不同,但是为您预定义了一个非常方便。