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

sud*_*ash 14 c++ c++20 c++-coroutine

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

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

cppcoro::task<> CallUseObject() {
    co_await UseObject(Object()); // is this valid?
}
Run Code Online (Sandbox Code Playgroud)

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

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

cppcoro::task<> CallUseObject() {
    Object stayingalive;
    co_await UseObject(stayingalive);
}
Run Code Online (Sandbox Code Playgroud)

因为staying_aliveco_await完成后被销毁了?

Mic*_*zel 11

这实际上是当前草案的一个未解决问题。引用问题:

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

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

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

  • 我想这一半回答了我的问题。你是说协程框架应该保存一个引用。问题的另一半是引用何时失效。在 co_await 完成之前对象是否会被销毁?或者在分号处。如果我误解了,请纠正我。 (2认同)