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
Antwort
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 einemco_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.
- 1. Direktaufruf Pythons Coroutine aus Coroutine
- 2. Coroutine wird nicht gestoppt Unity
- 3. Coroutine führt nicht setActive (false)
- 4. ReferenceError: Coroutine ist nicht definiert
- 5. aiohttp ws_response coroutine
- 6. Tornado Coroutine
- 7. Berechnung, ohne leere Werte
- 8. Leere Tabelle ohne Datenanzeige
- 9. Wie Unit-Test diese Coroutine ohne zu schlafen
- 10. Name der dynamischen Coroutine
- 11. Python Generator Coroutine
- 12. Warum wird die Eltern-Coroutine nicht abgebrochen?
- 13. C# Unity: Coroutine kann nicht gestoppt werden
- 14. Laden von Streamsassets von nicht-Coroutine-Methode?
- 15. Async Coroutine scheint nicht zu Ende
- 16. Coroutine funktioniert nicht einwandfrei - Unity [C#]
- 17. Aufruf Coroutine in Thread
- 18. Coroutine-Demo-Quelle/2
- 19. Zählen Objekte mit Coroutine
- 20. Coroutine Call Stacks
- 21. Kotlin Coroutine schluckt Ausnahme
- 22. Unity UnityWebRequest Coroutine
- 23. bluebirdjs Coroutine Fehlerbehandlung (Browser)
- 24. Tornado Coroutine - Benutzerdefinierte Funktion
- 25. Lokale "coroutine" Variablen in Kotlin
- 26. Code auf Coroutine schließen()
- 27. Was ist eine Coroutine?
- 28. Parsing leere Datei ohne Spalten
- 29. Aufruf einer Coroutine aus asyncio.Protocol.data_received
- 30. Entsperren tornado.queues.Queue.get() Coroutine wenn on_connection_close()?
Der 'co_await' Aufruf bewirkt, dass die Funktion implizit die' IAsyncAction' zurückgibt. –