传递给协程的临时何时会被销毁?
When do temporaries passed to coroutines get destroyed?
本文关键字:何时会 更新时间:2023-10-16
我对传递给协程任务的临时变量的生存期感到困惑。 请考虑以下示例:
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完成后被摧毁了?
这实际上是当前草案的一个未决问题的主题。引用问题:
目的是创建参数的副本/移动(如果需要),保留确切的类型(包括引用、r 引用等)。11.4.4[dcl.fct.def.coroutine]/11中的措辞似乎没有清楚地表达出来。
基于此,协程框架似乎将捕获对临时帧的引用。
由于co_await
是一个表达式,因此临时表达式应该在它出现的完整表达式的末尾被销毁。上面的代码是否安全将取决于所涉及的两个协程的具体实现是否能够安全地co_await
引用临时UseObject
调用。具体而言,请注意,co_await
的作用取决于两者、它所应用的表达式的类型以及它出现的协程的 promise 类型。此外,UseObject
(我们不知道它的定义)至少在原则上可以用它给出的参考做各种奇怪的事情......
相关文章:
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 函数何时会在c++中包含stack_Unwind_Resume调用
- Python中的for循环与C++有何不同
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 当我们从/tp地址中添加/减去一个整数时会发生什么
- TMap::Emplace() 在应用现有密钥时会覆盖吗?
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 为什么 boost::interprocess::managed_shared_memory 在施工时会抛出 boost
- 为什么程序在 c++ 中迭代 emtpy 向量时会抛出运行时错误
- 为什么 KMS drmModeSetCrtc() 在 X11 会话中运行时会失败并被拒绝权限?
- 在C++中释放内存期间,迭代器与指针有何不同
- 将指针分配给另一个指针时会发生什么情况?
- 为什么向量内部的指针在从函数返回时会发生变化?
- 当 std::move 与 C 样式数组或不移动对象时会发生什么
- 为什么根据测量位置测量经过的时间时会有很大的不同?
- 为什么我的功能在使用 goto 时会给我带来"expected primary-expression before '}' token"?
- 为什么我在尝试在单向链表中打印元素时会出现这个永无止境的循环
- 为什么当 vector 为空时会显示运行时错误?
- 为什么我在使用 istream 迭代器时会出现 seg 错误?
- C++11编译器何时会使RVO和NRVO优于移动语义和常量引用绑定