【发布时间】:2019-08-19 12:46:15
【问题描述】:
我对传递给协程任务的临时对象的生命周期感到困惑。考虑这个例子:
cppcoro::task<> UseObject(Object const& object);
cppcoro::task<> CallUseObject() {
co_await UseObject(Object()); // is this valid?
}
如果这些是返回 void 的函数,那么传递给 UseObject 的 Object() 将在分号处被销毁(即在 UseObject 完成之后)。但是,我不确定这是否同样适用于协程。通过引用将临时值传递给例程安全吗?如果不在分号处,临时对象什么时候会被销毁?
此外,作为健全性检查,写作是否总是安全的:
cppcoro::task<> CallUseObject() {
Object stayingalive;
co_await UseObject(stayingalive);
}
因为staying_alive 在 co_await 完成后被销毁?
【问题讨论】:
-
我很想说
Object()在声明的结尾处死了,但我可能是错的。似乎协程是“传值”的绝佳选择 -
如果函数调用通过引用接收参数的协程,调用者函数负责传递对象的生命周期,直到协程完成。这实际上与同步调用的规则相同,但是现在您还应该处理函数退出但未完成并且所有临时对象都被破坏的情况。 co_await 运算符没有帮助,因为此运算符适用于返回值,只有在函数退出后才能获得。
-
我最近使用 vs2019 的经验表明,您的第一个示例(Object()),直到 co_await 结束才调用析构函数。
标签: c++ c++20 c++-coroutine