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(我们不知道其定义)至少在原则上可以,使用给出的参考信息来做各种奇怪的事情……
| 归档时间: |
|
| 查看次数: |
289 次 |
| 最近记录: |