C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- å鿍¡æ¿(C++14 èµ·)
- æ´æ°åé¢é
- èååå§å
- æ¯è¾è¿ç®ç¬¦
- é»è®¤æ¯è¾(C++20 èµ·)
- 转ä¹åºå
- for 循ç¯
- while 循ç¯
- ç¨æ·å®ä¹è½¬æ¢
- SFINAE
- 䏻彿°
- ASCII ç 表
- æ è¯ç¬¦
- ç±»å
- å 忍¡å
- 对象
- åºæ¬æ¦å¿µ
- 表达å¼
- 声æ
- åå§å
- 彿°
- è¯å¥
- ç±»
- è¿ç®ç¬¦éè½½
- 模æ¿
- å¼å¸¸
- äºå¡æ§å å
- å ä½ç¬¦ç±»å说æç¬¦ (C++11 èµ·)
- decltype 说æç¬¦
- 彿°å£°æ
- final 说æç¬¦ (C++11 èµ·)
- override 说æç¬¦(C++11 èµ·)
- å¼ç¨å£°æ
- ç§»å¨æé 彿°
- ç§»å¨èµå¼è¿ç®ç¬¦
- æä¸¾å£°æ
- constexpr 说æç¬¦(C++11 èµ·)
- å表åå§å (C++11 èµ·)
- æé 彿°ä¸æååå§åå¨å表
- using 声æ
- nullptrï¼æéåé¢é
- åºç¡ç±»å
- ç±»åå«åï¼å«å模ç (C++11 èµ·)
- å½¢åå
- èåä½å£°æ
- å符串åé¢é
- ç¨æ·å®ä¹åé¢é (C++11 èµ·)
- 屿§è¯´æç¬¦åºå(C++11 èµ·)
- Lambda è¡¨è¾¾å¼ (C++11 èµ·)
- noexcept 说æç¬¦ (C++11 èµ·)
- noexcept è¿ç®ç¬¦ (C++11 èµ·)
- alignof è¿ç®ç¬¦(C++11 èµ·)
- alignas 说æç¬¦ (C++11 èµ·)
- åå¨ç±»è¯´æç¬¦
- åºäºèå´ç for å¾ªç¯ (C++11 èµ·)
- static_assert 声æ
- éå¼è½¬æ¢
- 代ç¨è¿ç®ç¬¦è¡¨ç¤º
- èªå¢/èªåè¿ç®ç¬¦
- æå 表达å¼(C++17 èµ·)
- 类模æ¿å®åæ¨å¯¼(C++17 èµ·)
- 模æ¿å½¢å䏿¨¡æ¿å®å
- if è¯å¥
- inline 说æç¬¦
- ç»æåç»å®å£°æ (C++17 èµ·)
- switch è¯å¥
- å符åé¢é
- å½å空é´
- æ±å¼é¡ºåº
- å¤å¶æ¶é¤
- consteval 说æç¬¦ (C++20 èµ·)
- constinit 说æç¬¦ (C++20 èµ·)
- åç¨ (C++20)
- 模å (C++20 èµ·)
- 约æä¸æ¦å¿µ (C++20 èµ·)
- new 表达å¼
- do-while 循ç¯
- continue è¯å¥
- break è¯å¥
- goto è¯å¥
- return è¯å¥
- 卿å¼å¸¸è¯´æ
- throw 表达å¼
- try å
- å½å空é´å«å
- 类声æ
- cvï¼const ä¸ volatileï¼ç±»åéå®ç¬¦
- é»è®¤åå§å
- å¼åå§å(C++03 èµ·)
- é¶åå§å
- å¤å¶åå§å
- ç´æ¥åå§å
- 常éåå§å
- å¼ç¨åå§å
- å¼ç±»å«
- C++ è¿ç®ç¬¦ä¼å 级
- å¸å°åé¢é
- æµ®ç¹åé¢é
- typedef 说æç¬¦
- æ¾å¼ç±»å转æ¢
- static_cast 转æ¢
- dynamic_cast 转æ¢
- const_cast 转æ¢
- reinterpret_cast 转æ¢
- delete 表达å¼
- æé 彿°ä¸æååå§åå¨å表
- this æé
- 访é®è¯´æç¬¦
- åå 声æ
- virtual 彿°è¯´æç¬¦
- explicit 说æç¬¦
- éææå
- é»è®¤æé 彿°
- å¤å¶æé 彿°
- å¤å¶èµå¼è¿ç®ç¬¦
- ææå½æ°
- 类模æ¿
- 彿°æ¨¡æ¿
- æ¾å¼ï¼å ¨ï¼æ¨¡æ¿ç¹å
- æ±ç¼å£°æ
- C++ çåå²
- ä½ç¨å
- çåæ
- å®ä¹ä¸åä¸å®ä¹è§åï¼ODRï¼
- å忥æ¾
- æéå®çå忥æ¾
- æ éå®çå忥æ¾
- å¦åè§å
- æªå®ä¹è¡ä¸º
- ç¿»è¯é¶æ®µ
- 常é表达å¼
- èµå¼è¿ç®ç¬¦
- ç®æ¯è¿ç®ç¬¦
- é»è¾è¿ç®ç¬¦
- æå访é®è¿ç®ç¬¦
- å ¶ä»è¿ç®ç¬¦
- sizeof è¿ç®ç¬¦
- typeid è¿ç®ç¬¦
- æé声æ
- æ°ç»å£°æ
- è¯è¨é¾æ¥
- 详述类å说æç¬¦
- é»è®¤å®å
- åé¿å®å
- å®åä¾èµæ¥æ¾
- éè½½å³è®®
- éè½½å½æ°çå°å
- æ³¨å ¥ç±»å
- ééææ°æ®æå
- ééææå彿°
- åµå¥ç±»
- æ´¾çç±»
- 空åºç±»ä¼å
- æ½è±¡ç±»
- ä½å
- è½¬æ¢æé 彿°
- æå模æ¿
- 模æ¿å®åæ¨å¯¼
- é¨å模æ¿ç¹å
- sizeof... è¿ç®ç¬¦
- å¾ å³å
- 彿° try å
- æ©å å½åç©ºé´ std
- åæ¯ç¼©å
- RAII
- ä¸/äº/é¶ä¹æ³å
- PImpl
- é¶å¼éåå
- ç±»å
- éå¼è½¬æ¢
- 注é
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- 容å¨åº
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- çº¿ç¨æ¯æåº
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >C++ è¯è¨ > åç¨ (C++20)
åç¨ (C++20)
åç¨æ¯è½æåæ§è¡ä»¥å¨ä¹åæ¢å¤ç彿°ãåç¨æ¯æ æ çï¼å®ä»¬éè¿è¿åå°è°ç¨æ¹æåæ§è¡ï¼å¹¶ä¸ä»æ å离å卿¢å¤æè¦æ±çæ°æ®ãè¿å 许ç¼å弿¥æ§è¡ç顺åºä»£ç ï¼ä¾å¦ä¸ä½¿ç¨æ¾å¼çåè°æ¥å¤çéé»å¡ I/Oï¼ï¼è¿æ¯æå¯¹æ°æ§è®¡ç®çæ éåºåä¸çç®æ³åå ¶ä»ç¨éã
è¥å½æ°çå®ä¹åä¸åä»»ä½å 容ä¹ä¸ï¼å宿¯åç¨ï¼
- ç¨
co_awaitè¿ç®ç¬¦æåæ§è¡ï¼ç´è³æ¢å¤
task<> tcp_echo_server() { char data[1024]; for (;;) { std::size_t n = co_await socket.async_read_some(buffer(data)); co_await async_write(socket, buffer(data, n)); } }
- ç¨å
³é®è¯
co_yieldæåæ§è¡å¹¶è¿åä¸ä¸ªå¼
generator<int> iota(int n = 0) { while(true) co_yield n++; }
- ç¨å ³é®è¯ co_return 宿æ§è¡å¹¶è¿åä¸ä¸ªå¼
lazy<int> f() { co_return 7; }
æ¯ä¸ªåç¨å¿ é¡»å ·æè½å¤æ»¡è¶³ä¸ç»è¦æ±çè¿åç±»åï¼æ 注äºä¸ã
éå¶
åç¨ä¸è½ä½¿ç¨åé¿å®åï¼æ®éç return è¯å¥ï¼æå ä½ç¬¦è¿åç±»åï¼auto æ Conceptï¼ã
constexpr 彿°ãæé 彿°ãææå½æ°å main 彿° ä¸è½æ¯åç¨ã
æ§è¡
æ¯ä¸ªåç¨åä¸ä¸åå¯¹è±¡å ³è
- æ¿è¯ºï¼promiseï¼å¯¹è±¡ï¼ä»åç¨å é¨æçºµãåç¨éè¿æ¤å¯¹è±¡æäº¤å ¶ç»ææå¼å¸¸ã
- åç¨å¥æ (coroutine handle)ï¼ä»åç¨å¤é¨æçºµãè¿æ¯ç¨äºæ¢å¤åç¨æ§è¡æéæ¯åç¨å¸§ç鿥ææã
- åç¨ç¶æ (coroutine state)ï¼å®æ¯ä¸ä¸ªå å«ä»¥ä¸å项çåé äºå ï¼é¤éä¼åæå ¶åé ï¼çå é¨å¯¹è±¡
- æ¿è¯ºå¯¹è±¡
- å个形åï¼å ¨é¨æå¼å¤å¶ï¼
- å½åæåç¹çæç§è¡¨ç¤ºï¼ä½¿å¾æ¢å¤æ¶ç¨åºç¥æè¦ä»ä½å¤ç»§ç»ï¼éæ¯æ¶ç¥ææåªäºå±é¨åéå¨ä½ç¨åå
- å±é¨åéå临æ¶éï¼å ¶çåæè·¨è¿å½åæåç¹
å½åç¨å¼å§æ§è¡æ¶ï¼å®è¿è¡ä¸åæä½ï¼
- ç¨ operator new åé åç¨ç¶æå¯¹è±¡ï¼è§ä¸æï¼
- å°ææå½æ°å½¢åå¤å¶å°åç¨ç¶æä¸ï¼æå¼ä¼ éçå½¢åè¢«ç§»å¨æå¤å¶ï¼æå¼ç¨ä¼ éçåæ°ä¿æä¸ºå¼ç¨ï¼å æ¤ï¼è¥å¨è¢«æä»£å¯¹è±¡ççåæç»æåæ¢å¤åç¨ï¼å ¶å¯è½å为æ¬åå¼ç¨ï¼
- è°ç¨æ¿è¯ºå¯¹è±¡çæé 彿°ãè¥æ¿è¯ºç±»åæ¥ææ¥æ¶ææåç¨å½¢åçæé 彿°ï¼å以å¤å¶åçåç¨å®åè°ç¨è¯¥æé 彿°ãå¦åè°ç¨å ¶é»è®¤æé 彿°ã
- è°ç¨ promise.get_return_object() å¹¶å°å ¶ç»æå¨å±é¨åéä¸ä¿æã该è°ç¨çç»æå°å¨åç¨é¦æ¬¡æåæ¶è¿åç»è°ç¨æ¹ãè³æ¤å¹¶å å«è¿ä¸ªæ¥éª¤ä¸ºæ¢ï¼ä»»ä½æåºçå¼å¸¸åä¼ æåè°ç¨æ¹ï¼èéç½®äºæ¿è¯ºä¸ã
- è°ç¨ promise.initial_suspend() å¹¶ co_await å ¶ç»æãå ¸åç Promise ç±»åï¼è¦ä¹ï¼å¯¹äºæ°æ§å¯å¨çåç¨ï¼è¿å std::suspend_alwaysï¼è¦ä¹ï¼å¯¹äºæ¥åå¯å¨çåç¨ï¼è¿å std::suspend_neverã
- å½ co_await promise.initial_suspend() æ¢å¤æ¶ï¼å¼å§åç¨ä½çæ§è¡ã
å½åç¨æµè¾¾æåç¹æ¶
- å°å åè·å¾çè¿å对象è¿åç»è°ç¨æ¹/æ¢å¤æ¹ï¼è¥éè¦åå éå¼è½¬æ¢å°åç¨çè¿åç±»åã
å½åç¨æµè¾¾ co_return è¯å¥æ¶ï¼å®è¿è¡ä¸åæä½ï¼
- 对ä¸åæ å½¢è°ç¨ promise.return_void()
- co_return;
- co_return exprï¼å ¶ä¸ expr å ·æ void ç±»å
- æ§å¶æµåºè¿å void çåç¨çç»å°¾ãæ¤æ åµä¸ï¼è¥ Promise ç±»åæ Promise::return_void() æå彿°ï¼åè¡ä¸ºæªå®ä¹ã
- æå¯¹äº co_return expr è°ç¨ promise.return_value(expr)ï¼å ¶ä¸ expr å ·æé void ç±»å
- 以å建çéåºéæ¯ææå ·æèªå¨å卿çåéã
- è°ç¨ promise.final_suspend() å¹¶ co_await å ¶ç»æã
è¥åç¨å æªææçå¼å¸¸ç»æï¼åå®è¿è¡ä¸åæä½ï¼
- ææå¼å¸¸å¹¶å¨ catch åå è°ç¨ promise.unhandled_exception()
- è°ç¨ promise.final_suspend() å¹¶ co_await å ¶ç»æï¼ä¾å¦ï¼ä»¥æ¢å¤æä¸ªç»§ç»æåå¸å ¶ç»æï¼ã仿¤ç¹ä¹åï¼æ¢å¤åç¨æ¯æªå®ä¹è¡ä¸ºã
å½ç»ç± co_return ææªææå¼å¸¸èç»æ¢åç¨å¯¼è´åç¨ç¶æè¢«éæ¯ï¼æç»ç±å
¶å¥æè导è´å
¶è¢«éæ¯æ¶ï¼å®è¿è¡ä¸åæä½ï¼
- è°ç¨æ¿è¯ºå¯¹è±¡çææå½æ°ã
- è°ç¨åä¸ªå½æ°å½¢å坿¬çææå½æ°ã
- è°ç¨ operator delete 以鿾åç¨ç¶ææç¨çå åã
- 转移æ§è¡åå°è°ç¨æ¹/æ¢å¤æ¹ã
å åé
åç¨ç¶æç±éæ°ç» operator new å¨å ä¸åé ã
è¥ Promise ç±»åå®ä¹äºç±»çº§å«çæ¿ä»£å½æ°ï¼åå°ä½¿ç¨å®ï¼å¦åå°ä½¿ç¨å ¨å±ç operator newã
è¥ Promise ç±»åå®ä¹äºæ¥æ¶é¢å¤å½¢åç operator new çå¸ç½®å½¢å¼ï¼èå®ä»¬æå¹é çå®åå表ä¸ï¼ç¬¬ä¸å®åæ¯è¦æ±ç大å°ï¼std::size_t ç±»åï¼ï¼èå ¶ä½åæ¯å个åç¨å½æ°å®åï¼åå°è¿äºå®åä¼ éç» operator newï¼è¿ä½¿å¾è½å¯¹åç¨ä½¿ç¨å导åé å¨çº¦å®ï¼
以䏿 åµä¸ï¼å¯ä»¥ä¼åæå¯¹ operator new çè°ç¨ï¼å³ä½¿ä½¿ç¨äºèªå®ä¹åé å¨ï¼ï¼
- åç¨ç¶æççåæä¸¥æ ¼å åµäºè°ç¨æ¹ççåæï¼ä¸
- åç¨å¸§ç大å°å¨è°ç¨ç¹å·²ç¥
该æ åµä¸ï¼åç¨ç¶æåµå ¥è°ç¨æ¹çæ 帧ï¼è¥è°ç¨æ¹æ¯æ®é彿°ï¼æåç¨ç¶æï¼è¥è°ç¨æ¹æ¯åç¨ï¼ä¹ä¸ã
è¥åé 失败ï¼ååç¨æåº std::bad_allocï¼é¤é Promise ç±»åå®ä¹äºæå彿° Promise::get_return_object_on_allocation_failure()ãè¥å®ä¹äºè¯¥æå彿°ï¼åä½¿ç¨ operator new ç nothrow å½¢å¼è¿è¡åé ï¼èå¨åé 失败æ¶ï¼åç¨ç«å³å°ä» Promise::get_return_object_on_allocation_failure() è·å¾ç对象è¿åç»è°ç¨æ¹ã
Promise
ç¼è¯å¨ç¨ std::coroutine_traits ä»åç¨çè¿åç±»åç¡®å® Promise ç±»åã
è¥åç¨è¢«å®ä¹ä¸º task<float> foo(std::string x, bool flag);ï¼åå ¶ Promise ç±»å为 std::coroutine_traits<task<float>, std::string, bool>::promise_typeã
è¥åç¨æ¯ééææå彿°ï¼å¦ task<void> my_class::method1(int x) const;ï¼åå ¶ Promise ç±»å为 std::coroutine_traits<task<void>, const my_class&, int>::promise_typeã
| æ¬èæªå®æ |
co_await
ä¸å è¿ç®ç¬¦ co_await æååç¨å¹¶å°æ§å¶è¿åç»è°ç¨æ¹ãå ¶æä½æ°æ¯ä¸ä¸ªè¡¨è¾¾å¼ï¼å ¶ç±»åå¿ é¡»è¦ä¹å®ä¹ operator co_awaitï¼è¦ä¹è½ä»¥å½ååç¨ç Promise::await_transform 转æ¢å°è¿ç§ç±»åã
co_await 表达å¼
|
|||||||||
é¦å ï¼ä»¥ä¸åæ¹å¼å° è¡¨è¾¾å¼ è½¬æ¢æå¯çå¾ ä½ï¼awaitableï¼ï¼
- è¥ è¡¨è¾¾å¼ ç±åå§æåç¹ãæç»æåç¹æ yield è¡¨è¾¾å¼æäº§çï¼åå¯çå¾ ä½ä¸º è¡¨è¾¾å¼ æ¬èº«ã
- å¦åï¼è¥å½ååç¨ç Promise ç±»åæ¥ææå彿° await_transformï¼åå¯çå¾ ä½ä¸º promise.await_transform(表达å¼)ã
- å¦åï¼å¯çå¾ ä½ä¸º è¡¨è¾¾å¼ æ¬èº«ã
ç¶å以ä¸åæ¹å¼è·å¾çå¾ å¨ï¼awaiterï¼å¯¹è±¡ï¼
- è¥é对 operator co_await çéè½½å³è®®ç»åºå个æä½³éè½½ï¼åçå¾ å¨æ¯è¯¥è°ç¨çç»æï¼å¯¹äºæåé载为 awaitable.operator co_await();ï¼å¯¹äºéæåé载为 operator co_await(static_cast<Awaitable&&>(awaitable));ï¼
- å¦åï¼è¥éè½½å³è®®æ¾ä¸å°
operator co_awaitï¼åçå¾ å¨æ¯å¯çå¾ ä½æ¬èº« - å¦åï¼è¥éè½½å³è®®ææ§ä¹ï¼åç¨åºéè¯æ
è¥ä¸è¿°è¡¨è¾¾å¼ä¸ºçº¯å³å¼ï¼åçå¾ å¨å¯¹è±¡æ¯ä»å®å®è´¨åç临æ¶éãå¦åï¼è¥ä¸è¿°è¡¨è¾¾å¼ä¸ºæ³å·¦å¼ï¼åçå¾ å¨å¯¹è±¡æ¯å ¶ææä»£ç对象ã
ç¶åï¼è°ç¨ awaiter.await_ready()ï¼è¿æ¯å½å·²ç¥ç»æå°±ç»ªæå¯ä»¥åæ¥å®ææ¶ï¼ç¨ä»¥é¿å
æåå¼éçå¿«æ·æ¹å¼ï¼ãè¥å
¶ç»ææè¯å¢è½¬æ¢æ bool 为 falseï¼å
- æååç¨ï¼ä»¥åå±é¨åéåå½åæåç¹å¡«å å ¶åç¨ç¶æï¼ã
- è°ç¨ awaiter.await_suspend(handle)ï¼å
¶ä¸ handle æ¯è¡¨ç¤ºå½ååç¨çåç¨å¥æãè¿ä¸ªå½æ°å
é¨å¯éè¿è¿ä¸ªå¥æè§å¯æåçåç¨ï¼è䏿¤å½æ°è´è´£è°åº¦å®ä»¥å¨æä¸ªæ§è¡å¨ä¸æ¢å¤ï¼æå°å
¶éæ¯ï¼å¹¶è¿å
falseå½åè°åº¦ï¼- è¥
await_suspendè¿åvoidï¼åå°æ§å¶ç«å³è¿åç»å½ååç¨çè°ç¨æ¹/æ¢å¤æ¹ï¼æ¤åç¨ä¿ææåï¼ï¼å¦å - è¥
await_suspendè¿åboolï¼å
- å¼ä¸º true æ¶å°æ§å¶è¿åç»å½ååç¨çè°ç¨æ¹/æ¢å¤æ¹
- å¼ä¸º false æ¶æ¢å¤å½ååç¨ã
- è¥
await_suspendè¿åæä¸ªå ¶ä»åç¨çåç¨å¥æï¼åï¼éè¿è°ç¨ handle.resume()ï¼æ¢å¤è¯¥å¥æï¼æ³¨æè¿å¯ä»¥è¿éè¿è¡ï¼å¹¶æç»å¯¼è´å½ååç¨æ¢å¤ï¼ - è¥
await_suspendæå¼å¸¸ï¼åææè¯¥å¼å¸¸ï¼æ¢å¤åç¨ï¼å¹¶ç«å³éæå¼å¸¸
- è¥
- æåï¼è°ç¨ awaiter.await_resume()ï¼èå ¶ç»æå°±æ¯æ´ä¸ª co_await expr 表达å¼çç»æã
è¥åç¨å¨ co_await 表达å¼ä¸æåï¼èä¹åæ¢å¤ï¼åæ¢å¤ç¹å¤äºç´§æ¥å¯¹ awaiter.await_resume() çè°ç¨ä¹åã
注æï¼å 为åç¨å¨è¿å
¥ awaiter.await_suspend() åå·²å®å
¨æåï¼æä»¥è¯¥å½æ°å¯ä»¥èªç±å°å¨çº¿ç¨é´è½¬ç§»åç¨æï¼èæ éé¢å¤åæ¥ãä¾å¦ï¼å¯ä»¥å°å®æ¾å
¥åè°ï¼å°å®è°åº¦æå¨å¼æ¥ I/O æä½å®ææ¶å¨çº¿ç¨æ± ä¸è¿è¡çãè¿ä¹è¡¨ç¤ºå½ååç¨å¯è½å¹¶åå°å¨è¿ä¸ªçº¿ç¨æ± 䏿¢å¤å¹¶ç»æï¼åæ¶ä»å¨ await_suspend() ä¹å
ï¼æ
è await_suspend() å¨å°å¥æåå¸ç»å
¶ä»çº¿ç¨åä¸åºæå¾
å
¶çå¾
å¨ï¼*this 对象ï¼ä»å¯è®¿é®ã
注æï¼çå¾ å¨å¯¹è±¡æ¯åç¨ç¶æçä¸é¨åï¼ä½ä¸ºçåæè·¨è¿æåç¹ç临æ¶éï¼ï¼å¹¶ä¸å¨ co_await 表达å¼ç»æå鿝ãå¯ä»¥ç¨å®ç»´æ¤æäºå¼æ¥ I/O API æè¦æ±çæ¯æä½å ç¶æï¼èæ éç¨å°é¢å¤çå åé ã
æ ååºå®ä¹äºä¸¤ä¸ªå¹³å¡çå¯çå¾ ä½ï¼std::suspend_always å std::suspend_neverã
| æ¬èæªå®æ åå ï¼ç¤ºä¾ |
co_yield
yield 表达å¼åè°ç¨æ¹è¿åä¸ä¸ªå¼å¹¶æåå½ååç¨ï¼å®æ¯å¯æ¢å¤çæå¨å½æ°çå¸¸ç¨æå»ºå
co_yield 表达å¼
|
|||||||||
co_yield è±æ¬å·åå§åå¨å表
|
|||||||||
å®çä»·äº
co_await promise.yield_value(表达å¼)
å
¸åççæå¨ç yield_value ä¼å°å
¶å®ååå¨ï¼å¤å¶/ç§»å¨æä»
åå¨å
¶å°åï¼å 为å®åççåæè·¨è¿ co_await å
çæåç¹ï¼å°çæå¨å¯¹è±¡ä¸å¹¶è¿å std::suspend_alwaysï¼å°æ§å¶è½¬ç§»ç»è°ç¨æ¹/æ¢å¤æ¹ã
| æ¬èæªå®æ åå ï¼ç¤ºä¾ |
åºæ¯æ
| æ¬èæªå®æ |