2017-09-13 2 views
0

Ich versuche, meinen Kopf um die C++ - Coroutine-Funktion zu wickeln. Ich las Kennys Artikel (C++ - Introducing C++/WinRT) und versuchte auch, diese Präsentation zu sehen, CppCon 2016: James McNellis “Introduction to C++ Coroutines". Ich sehe nicht-void "Funktionen" ohne irgendeine Form von Return-Anweisung. Als Beispiel sehen Sie das folgende Codebeispiel aus Kennys Artikel. Die PrintFeedAsync Funktion/Coroutine hat eine IAsyncAction Rückgabetyp, aber es gibt keine Rückgabeanweisung in der Definition. Könnte jemand erklären, wie das funktioniert?Nicht leere Coroutine ohne Return-Anweisung

+0

Der 'co_await' Aufruf bewirkt, dass die Funktion implizit die' IAsyncAction' zurückgibt. –

Antwort

0

Damit eine Funktion eine Coroutine sein kann, muss der Rückgabetyp bestimmte Merkmale definiert haben, die beschreiben, wie die Coroutine funktioniert. C++/WinRT definiert diese Merkmale für ihre Version IAsyncAction oder IAsyncOperation<TResult>. Insbesondere gibt es zwei Methoden, die die Rückkehr aus einer Coroutine behandeln: return_value(...) oder return_void(). IAsyncOperation verwendet ersteres, und IAsyncAction verwendet letzteres.

spätestens Koroutine spec dieser Antwort zu der Zeit der Suche, finden wir, was passiert, wenn es in dem Körper einer Koroutine Funktion keine co_return Anweisung lautet:

Wenn p.return_void() ein gültiger Ausdruck, abfließende das Ende einer Coroutine entspricht einem co_return ohne Operanden; Andernfalls fließt das Ende einer Coroutine in undefiniertes Verhalten.

"Programming Languages – C++ Extensions for Coroutines" (N4680) § 6.6.3.1/3

Da C++/WinRT eine return_void for IAsyncAction's traits definiert dann wird der Compiler die obige Regel folgen. An dem Ende, an dem die Ausführung am Ende der Coroutine abläuft, wird die Methode return_void verwendet, genauso, als ob Sie die Funktion mit co_return; beendet hätten. Wenn wir uns die Definition von return_void ansehen, sehen wir, dass dies dem Setzen des Status als Completed und dem Aufruf des Completion-Handlers entspricht, falls es einen gibt.