传递给协程的临时人员何时被销毁?

时间:2019-03-28 16:40:06

标签: c++ c++20 c++-coroutine

我对传递给协程任务的临时人员的一生感到困惑。考虑以下示例:

cppcoro::task<> UseObject(Object const& object);

cppcoro::task<> CallUseObject() {
    co_await UseObject(Object()); // is this valid?
}

如果这些函数返回void,则传递给Object()的{​​{1}}将在分号处被破坏(即UseObject完成后)。但是,我不确定协程是否同样适用。通过引用将临时传递给例程是否安全?如果不是在分号上,临时人员什么时候会被销毁?

此外,作为健全性检查,是否总是可以安全编写:

UseObject

cppcoro::task<> CallUseObject() { Object stayingalive; co_await UseObject(stayingalive); } 是因为co_await完成后被销毁了?

1 个答案:

答案 0 :(得分:11)

这实际上是open issuecurrent draft的主题。引用问题:

  

目的是创建保留精确类型(包括引用,r引用等)的参数的副本/动作(如果需要)。 11.4.4 [dcl.fct.def.coroutine] / 11中的措词似乎并没有清楚地表达这一点。

基于此,协同程序框架似乎将捕获对临时文件的引用。

由于co_await是一个表达式,因此临时变量应该在它所在的完整表达式的结尾处被销毁。上面的代码是否安全,将取决于所涉及的两个协程的具体实现是否可以保证在调用co_await并引用一个临时变量时UseObject是安全的。具体来说,请注意co_await的作用取决于它所应用的表达式的类型以及它所出现的协程的promise类型。此外,UseObject(我们不知道的定义,至少在原则上,可以使用它给出的参考来做各种奇怪的事情……