이 질문은이 의견에서 비롯됩니다 : C ++ 20 코 루틴에 대한 Lambda 수명 설명
이 예와 관련하여 :
auto foo() -> folly::coro::Task<int> {
auto task = []() -> folly::coro::Task<int> {
co_return 1;
}();
return task;
}
따라서 반환 된 코 루틴을 실행하면 foo
UB가 발생 하는지 여부가 문제입니다 .
"객체의 수명이 끝난 후"멤버 함수 "호출"은 UB입니다. http://eel.is/c++draft/basic.life#6.2
... 물체가 위치하거나 위치 할 저장 위치의 주소를 나타내는 포인터는 제한적으로 만 사용될 수 있습니다. [...] 다음과 같은 경우 프로그램에 정의되지 않은 동작이 있습니다.
[...]
- 포인터가 액세스 할 수있는 비 - 정적 데이터 부재를 사용하거나되는 물체의 비 정적 멤버 함수를 호출 하거나
그러나이 예에서는
()
람다의 수명은 여전히 유효하지만 람다 의 연산자가 호출됩니다.- 그런 다음 일시 중지됩니다.
- 람다는 파괴되고
- 그런 다음 멤버 함수 (operator
()
)가 나중에 어느 시점에서 다시 시작됩니다.
이 재개는 정의되지 않은 동작으로 간주됩니까?
this
포인터가 무효화됩니다. 의견의 토론도 고려하십시오.