2017-09-13 4 views
0

나는 C++ 코 루틴 (coroutine) 기능을 고수하려고한다. 케니의 기사 (C++ - Introducing C++/WinRT)를 읽고이 프리젠 테이션을 보았습니다. CppCon 2016: James McNellis “Introduction to C++ Coroutines". 나는 어떤 형태의 return 문없이 비 - 공백 "함수"를 계속보고있다. 예를 들어, Kenny의 기사에있는 다음 코드 샘플을 참조하십시오. PrintFeedAsync 함수/동시 루틴은 IAsyncAction 반환 형식이 있지만 정의에 return 문이 없습니다. 누군가가 어떻게 작동하는지 설명 할 수 있습니까?Return 문없이 비 void 코 루틴

IAsyncAction PrintFeedAsync() 
{ 
    Uri uri(L"http://kennykerr.ca/feed"); 
    SyndicationClient client; 
    SyndicationFeed feed = co_await client.RetrieveFeedAsync(uri); 
    for (SyndicationItem item : feed.Items()) 
    { 
     hstring title = item.Title().Text(); 
     printf("%ls\n", title.c_str()); 
    } 
} 

int main() 
{ 
    initialize(); 
    PrintFeedAsync().get(); 
} 
+0

'co_await' 호출은 함수가 암시 적으로'IAsyncAction'을 반환하게하는 원인입니다. –

답변

0

coroutine이되는 함수의 경우 반환 유형에는 coroutine이 작동하는 방법을 설명하는 특정 특성이 정의되어 있어야합니다. C++/WinRT는 IAsyncAction 또는 IAsyncOperation<TResult> 버전의 특성을 정의합니다. 특히, coroutine에서 복귀하는 두 가지 방법, 즉 return_value(...) 또는 return_void()이 있습니다. IAsyncOperation은 전자를 사용하고 IAsyncAction은 전자를 사용합니다. p.return_void()이 떨어져 흐르는, 올바른 표현이다

경우 :이 답변시의 최신 코 루틴 스펙을 보면

, 우리는 코 루틴 함수의 몸에 더 co_return 문이없는 경우 어떤 일이 발생 찾을 수 코 루틴의 끝은 피연산자가없는 co_return과 같습니다. 그렇지 않으면 코 루틴의 끝에서 흘러 나오면 정의되지 않은 동작이 발생합니다.

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

C++/WinRT는 return_void for IAsyncAction's traits을 정의하므로 다음 컴파일러는 위의 규칙을 따릅니다. 마지막으로 coroutine의 끝에서 실행이 끝나면 return_void 메소드가 사용되며, 마치 co_return;으로 함수를 끝낸 것과 같습니다. return_void의 정의를 살펴보면, Completed로 상태를 설정하고 완료 핸들러가 있으면 호출하는 것과 같습니다.

관련 문제