Câu hỏi này xuất phát từ nhận xét này: Giải thích trọn đời Lambda cho C ++ 20 coroutines
liên quan đến ví dụ này:
auto foo() -> folly::coro::Task<int> {
auto task = []() -> folly::coro::Task<int> {
co_return 1;
}();
return task;
}
Vì vậy, câu hỏi là liệu thực thi coroutine được trả về foo
sẽ dẫn đến UB.
"Gọi" một hàm thành viên (sau khi thời gian tồn tại của đối tượng kết thúc) là UB: http://eel.is/c++draft/basic.life#6.2
... Bất kỳ con trỏ nào đại diện cho địa chỉ của vị trí lưu trữ nơi đối tượng sẽ hoặc được định vị đều có thể được sử dụng nhưng chỉ theo những cách giới hạn. [...] Chương trình có hành vi không xác định nếu:
[...]
- con trỏ được sử dụng để truy cập thành viên dữ liệu không tĩnh hoặc gọi hàm thành viên không tĩnh của đối tượng hoặc
Tuy nhiên, trong ví dụ này:
- các
()
nhà điều hành của lambda được gọi trong khi tuổi thọ của lambda vẫn còn hợp lệ - Sau đó nó bị đình chỉ,
- sau đó lambda bị phá hủy,
- và sau đó hàm thành viên (toán tử
()
) được nối lại tại một số điểm sau đó.
Là tiếp tục này được coi là hành vi không xác định?
this
con trỏ bị vô hiệu. Cũng xem xét các cuộc thảo luận trong các ý kiến.