我想知道下面的代碼是否是有效的 C 代碼,或者如果不使用co_return會導致未定義的行為。
IAsyncAction MyClass::MyCoroutine()
{
co_await someOtherClassInstance.SomeCoroutine();
}
即是否需要如下調整代碼?
IAsyncAction MyClass::MyCoroutine()
{
co_await someOtherClassInstance.SomeCoroutine();
co_return;
}
如果行為不是未定義的,那么最佳實踐是什么(總是添加co_return或不添加)以及這樣做的理由是什么?
uj5u.com熱心網友回復:
此處對省略co_return;宣告進行了明確定義。根據[stmt.return.coroutine],只要p.return_void()是一個有效的運算式(ppromise 型別在哪里),就允許這樣做。
C /WinRT 實作return_void()了IAsyncAction和IAsyncActionWithProgress(或者更確切地說是這些的內部等待配接器結構)。
由于co_return;這里的陳述句是純可選的,是否使用它取決于個人喜好。co_return;就個人而言,出于以下幾個原因,我更喜歡閱讀存在陳述句的代碼:
- 它使我可以輕松地注釋掉協程的一部分(例如用于測驗),而不必冒險將其變成常規函式。
- 我不必了解復雜的 C /WinRT 庫的錯綜復雜之處即可確定代碼是否正確。
- 如果我決定更改其回傳型別,代碼將保持正確。
uj5u.com熱心網友回復:
根據cppreferencePromise::return_void() ,如果 Promise 型別沒有成員函式,第一個塊只會導致未定義的行為:
當協程到達
co_return陳述句時,它執行以下操作:
- 呼吁
promise.return_void()_
co_return;co_return expr哪里expr有型別 void- 從回傳 void 的協同程式的末尾掉下來。如果Promise 型別在這種情況下沒有成員函式,則行為未定義。
Promise::return_void()
換句話說,標準草案似乎是這么說的:
If
p.return_-void()是一個有效的運算式,流出協程函式體的末尾等同于co_-return沒有運算元的 a;否則從協程函式體的末尾流出會導致未定義的行為。
[在兩個引號中強調我的]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/534081.html
