คำถามนี้เกิดจากความคิดเห็นนี้: คำอธิบายตลอดอายุการใช้งานแลมบ์ดาสำหรับ coroutines C ++ 20
เกี่ยวกับตัวอย่างนี้:
auto foo() -> folly::coro::Task<int> {
auto task = []() -> folly::coro::Task<int> {
co_return 1;
}();
return task;
}
ดังนั้นคำถามคือการดำเนินการ coroutine กลับโดยfoo
จะส่งผลใน UB
"การเรียก" ฟังก์ชันสมาชิก (หลังจากสิ้นสุดอายุการใช้งานของวัตถุ) คือ UB: http://eel.is/c++draft/basic.life#6.2
... ตัวชี้ใด ๆ ที่แสดงที่อยู่ของที่เก็บสินค้าซึ่งวัตถุนั้นจะเป็นหรือที่ตั้งอาจถูกนำมาใช้ แต่ในรูปแบบที่ จำกัด เท่านั้น [... ] โปรแกรมมีพฤติกรรมที่ไม่ได้กำหนดหาก:
[ ... ]
- ตัวชี้ใช้เพื่อเข้าถึงสมาชิกข้อมูลที่ไม่คงที่หรือเรียกใช้ฟังก์ชันสมาชิกแบบไม่คงที่ของวัตถุหรือ
อย่างไรก็ตามในตัวอย่างนี้:
- ตัว
()
ดำเนินการของแลมบ์ดานั้นถูกเรียกในขณะที่อายุของแลมบ์ดายังคงมีผลอยู่ - มันถูกระงับแล้ว
- แลมบ์ดาก็ถูกทำลาย
- จากนั้นฟังก์ชันสมาชิก (โอเปอเรเตอร์
()
) จะกลับมาทำงานอีกครั้งหลังจากนั้น
การเริ่มต้นใหม่นี้ถือเป็นพฤติกรรมที่ไม่ได้กำหนดหรือไม่?
this
ตัวชี้ไม่ถูกต้อง พิจารณาการอภิปรายในความคิดเห็นด้วย