我对传递给协程任务的临时人员的一生感到困惑。考虑以下示例:
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完成后被销毁了?
答案 0 :(得分:11)
这实际上是open issue与current draft的主题。引用问题:
目的是创建保留精确类型(包括引用,r引用等)的参数的副本/动作(如果需要)。 11.4.4 [dcl.fct.def.coroutine] / 11中的措词似乎并没有清楚地表达这一点。
基于此,协同程序框架似乎将捕获对临时文件的引用。
由于co_await
是一个表达式,因此临时变量应该在它所在的完整表达式的结尾处被销毁。上面的代码是否安全,将取决于所涉及的两个协程的具体实现是否可以保证在调用co_await
并引用一个临时变量时UseObject
是安全的。具体来说,请注意co_await
的作用取决于它所应用的表达式的类型以及它所出现的协程的promise类型。此外,UseObject
(我们不知道的定义,至少在原则上,可以使用它给出的参考来做各种奇怪的事情……