[{"data":1,"prerenderedAt":3875},["ShallowReactive",2],{"wiki-page-\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0500-future-async-promise":3,"wiki-doc-items-\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0500-future-async-promise":3431,"language-switcher-data-\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0500-future-async-promise":3859,"wiki-i18n-paths-\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0500-future-async-promise":3874},{"id":4,"title":5,"body":6,"canonicalPath":3412,"chapterDepth":61,"chapterOrder":3413,"date":3414,"description":3415,"docI18nKey":3416,"docKey":3417,"docRoot":3418,"docTitle":3419,"extension":3420,"i18nKey":3421,"isBlogPost":3422,"isWikiDoc":247,"isWikiIndex":3422,"layout":3423,"legacyPath":3423,"locale":3424,"localeSlug":3425,"meta":3426,"navigation":247,"path":3412,"seo":3427,"sourcePath":3428,"sourceStem":3421,"stem":3429,"wikiDepth":50,"__hash__":3430},"content\u002F_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0500-future-async-promise.md","future、async、promise 與 packaged_task",{"type":7,"value":8,"toc":3370},"minimark",[9,17,30,37,91,94,104,113,118,126,129,145,152,155,169,174,215,222,452,455,471,474,486,489,503,506,509,515,526,529,545,548,565,568,582,593,598,605,629,632,635,640,646,670,673,676,698,701,703,918,929,933,936,959,962,968,971,986,989,997,1007,1079,1085,1088,1101,1104,1112,1125,1128,1131,1144,1146,1200,1208,1248,1251,1290,1293,1516,1520,1529,1532,1726,1729,1741,1744,1747,1754,1759,1762,1768,1771,1786,1789,1791,1988,1995,2011,2014,2021,2035,2038,2045,2058,2061,2068,2071,2129,2132,2145,2148,2151,2463,2467,2473,2484,2487,2498,2501,2504,2506,2577,2584,2589,2594,2596,2773,2775,2801,2804,2810,2818,2984,2989,3005,3008,3014,3023,3028,3033,3038,3043,3045,3051,3058,3063,3075,3078,3081,3100,3103,3168,3171,3185,3188,3197,3200,3206,3209,3228,3230,3236,3239,3257,3260,3264,3314,3317,3366],[10,11,12,16],"p",{},[13,14,15],"code",{},"std::thread"," 很適合表達“啓動一個線程”，但它本身不直接提供：",[18,19,20,24,27],"ul",{},[21,22,23],"li",{},"線程函數返回值；",[21,25,26],{},"異常自動傳回調用方；",[21,28,29],{},"一個統一的“未來結果”對象。",[10,31,32,33,36],{},"C++11 在 ",[13,34,35],{},"\u003Cfuture>"," 中提供了一組更偏“任務”的併發工具：",[38,39,44],"pre",{"className":40,"code":41,"language":42,"meta":43,"style":43},"language-cpp shiki shiki-themes github-light github-dark","std::future\nstd::async\nstd::promise\nstd::packaged_task\nstd::shared_future\n","cpp","",[13,45,46,59,67,75,83],{"__ignoreMap":43},[47,48,51,55],"span",{"class":49,"line":50},"line",1,[47,52,54],{"class":53},"sScJk","std",[47,56,58],{"class":57},"sVt8B","::future\n",[47,60,62,64],{"class":49,"line":61},2,[47,63,54],{"class":53},[47,65,66],{"class":57},"::async\n",[47,68,70,72],{"class":49,"line":69},3,[47,71,54],{"class":53},[47,73,74],{"class":57},"::promise\n",[47,76,78,80],{"class":49,"line":77},4,[47,79,54],{"class":53},[47,81,82],{"class":57},"::packaged_task\n",[47,84,86,88],{"class":49,"line":85},5,[47,87,54],{"class":53},[47,89,90],{"class":57},"::shared_future\n",[10,92,93],{},"它們的核心思想是：",[95,96,97],"blockquote",{},[10,98,99,100,103],{},"某個結果現在還沒有，但未來會產生；調用方先拿到一個 ",[13,101,102],{},"future","，之後再等待或取得結果。",[105,106,108,109,112],"h2",{"id":107},"_1-stdfuturet-是什麼","1. ",[13,110,111],{},"std::future\u003CT>"," 是什麼",[10,114,115,117],{},[13,116,111],{}," 表示：",[38,119,124],{"className":120,"code":122,"language":123,"meta":43},[121],"language-text","未来某个时刻会得到一个 T\n","text",[13,125,122],{"__ignoreMap":43},[10,127,128],{},"例如：",[38,130,132],{"className":40,"code":131,"language":42,"meta":43,"style":43},"std::future\u003Cint>\n",[13,133,134],{"__ignoreMap":43},[47,135,136,138,141],{"class":49,"line":50},[47,137,54],{"class":53},[47,139,140],{"class":57},"::future",[47,142,144],{"class":143},"szBVR","\u003Cint>\n",[10,146,147,148,151],{},"表示未來會產生一個 ",[13,149,150],{},"int","。",[10,153,154],{},"如果任務沒有返回值，則使用：",[38,156,158],{"className":40,"code":157,"language":42,"meta":43,"style":43},"std::future\u003Cvoid>\n",[13,159,160],{"__ignoreMap":43},[47,161,162,164,166],{"class":49,"line":50},[47,163,54],{"class":53},[47,165,140],{"class":57},[47,167,168],{"class":143},"\u003Cvoid>\n",[10,170,171,173],{},[13,172,102],{}," 最重要的成員函數包括：",[38,175,177],{"className":40,"code":176,"language":42,"meta":43,"style":43},"get()\nwait()\nwait_for()\nwait_until()\nvalid()\n",[13,178,179,187,194,201,208],{"__ignoreMap":43},[47,180,181,184],{"class":49,"line":50},[47,182,183],{"class":53},"get",[47,185,186],{"class":57},"()\n",[47,188,189,192],{"class":49,"line":61},[47,190,191],{"class":53},"wait",[47,193,186],{"class":57},[47,195,196,199],{"class":49,"line":69},[47,197,198],{"class":53},"wait_for",[47,200,186],{"class":57},[47,202,203,206],{"class":49,"line":77},[47,204,205],{"class":53},"wait_until",[47,207,186],{"class":57},[47,209,210,213],{"class":49,"line":85},[47,211,212],{"class":53},"valid",[47,214,186],{"class":57},[105,216,218,219],{"id":217},"_2-最簡單的-stdasync","2. 最簡單的 ",[13,220,221],{},"std::async",[38,223,225],{"className":40,"code":224,"language":42,"meta":43,"style":43},"#include \u003Cfuture>\n#include \u003Ciostream>\n\nint calculate(int a, int b)\n{\n    return a + b;\n}\n\nint main()\n{\n    std::future\u003Cint> result = std::async(\n        std::launch::async,\n        calculate,\n        10,\n        20);\n\n    std::cout \u003C\u003C \"main continues\\n\";\n    std::cout \u003C\u003C result.get() \u003C\u003C '\\n';\n}\n",[13,226,227,236,243,249,276,281,296,302,307,317,322,351,365,371,381,390,395,418,447],{"__ignoreMap":43},[47,228,229,232],{"class":49,"line":50},[47,230,231],{"class":143},"#include",[47,233,235],{"class":234},"sZZnC"," \u003Cfuture>\n",[47,237,238,240],{"class":49,"line":61},[47,239,231],{"class":143},[47,241,242],{"class":234}," \u003Ciostream>\n",[47,244,245],{"class":49,"line":69},[47,246,248],{"emptyLinePlaceholder":247},true,"\n",[47,250,251,253,256,259,261,265,268,270,273],{"class":49,"line":77},[47,252,150],{"class":143},[47,254,255],{"class":53}," calculate",[47,257,258],{"class":57},"(",[47,260,150],{"class":143},[47,262,264],{"class":263},"s4XuR"," a",[47,266,267],{"class":57},", ",[47,269,150],{"class":143},[47,271,272],{"class":263}," b",[47,274,275],{"class":57},")\n",[47,277,278],{"class":49,"line":85},[47,279,280],{"class":57},"{\n",[47,282,284,287,290,293],{"class":49,"line":283},6,[47,285,286],{"class":143},"    return",[47,288,289],{"class":57}," a ",[47,291,292],{"class":143},"+",[47,294,295],{"class":57}," b;\n",[47,297,299],{"class":49,"line":298},7,[47,300,301],{"class":57},"}\n",[47,303,305],{"class":49,"line":304},8,[47,306,248],{"emptyLinePlaceholder":247},[47,308,310,312,315],{"class":49,"line":309},9,[47,311,150],{"class":143},[47,313,314],{"class":53}," main",[47,316,186],{"class":57},[47,318,320],{"class":49,"line":319},10,[47,321,280],{"class":57},[47,323,325,328,330,333,336,339,342,345,348],{"class":49,"line":324},11,[47,326,327],{"class":53},"    std",[47,329,140],{"class":57},[47,331,332],{"class":143},"\u003Cint>",[47,334,335],{"class":57}," result ",[47,337,338],{"class":143},"=",[47,340,341],{"class":53}," std",[47,343,344],{"class":57},"::",[47,346,347],{"class":53},"async",[47,349,350],{"class":57},"(\n",[47,352,354,357,359,362],{"class":49,"line":353},12,[47,355,356],{"class":53},"        std",[47,358,344],{"class":57},[47,360,361],{"class":53},"launch",[47,363,364],{"class":57},"::async,\n",[47,366,368],{"class":49,"line":367},13,[47,369,370],{"class":57},"        calculate,\n",[47,372,374,378],{"class":49,"line":373},14,[47,375,377],{"class":376},"sj4cs","        10",[47,379,380],{"class":57},",\n",[47,382,384,387],{"class":49,"line":383},15,[47,385,386],{"class":376},"        20",[47,388,389],{"class":57},");\n",[47,391,393],{"class":49,"line":392},16,[47,394,248],{"emptyLinePlaceholder":247},[47,396,398,400,403,406,409,412,415],{"class":49,"line":397},17,[47,399,327],{"class":53},[47,401,402],{"class":57},"::cout ",[47,404,405],{"class":143},"\u003C\u003C",[47,407,408],{"class":234}," \"main continues",[47,410,411],{"class":376},"\\n",[47,413,414],{"class":234},"\"",[47,416,417],{"class":57},";\n",[47,419,421,423,425,427,430,432,435,437,440,442,445],{"class":49,"line":420},18,[47,422,327],{"class":53},[47,424,402],{"class":57},[47,426,405],{"class":143},[47,428,429],{"class":57}," result.",[47,431,183],{"class":53},[47,433,434],{"class":57},"() ",[47,436,405],{"class":143},[47,438,439],{"class":234}," '",[47,441,411],{"class":376},[47,443,444],{"class":234},"'",[47,446,417],{"class":57},[47,448,450],{"class":49,"line":449},19,[47,451,301],{"class":57},[10,453,454],{},"這裏：",[38,456,458],{"className":40,"code":457,"language":42,"meta":43,"style":43},"std::async(...)\n",[13,459,460],{"__ignoreMap":43},[47,461,462,464,466,468],{"class":49,"line":50},[47,463,54],{"class":53},[47,465,344],{"class":57},[47,467,347],{"class":53},[47,469,470],{"class":57},"(...)\n",[10,472,473],{},"啓動一個異步任務，並返回：",[38,475,476],{"className":40,"code":131,"language":42,"meta":43,"style":43},[13,477,478],{"__ignoreMap":43},[47,479,480,482,484],{"class":49,"line":50},[47,481,54],{"class":53},[47,483,140],{"class":57},[47,485,144],{"class":143},[10,487,488],{},"調用：",[38,490,492],{"className":40,"code":491,"language":42,"meta":43,"style":43},"result.get()\n",[13,493,494],{"__ignoreMap":43},[47,495,496,499,501],{"class":49,"line":50},[47,497,498],{"class":57},"result.",[47,500,183],{"class":53},[47,502,186],{"class":57},[10,504,505],{},"時，如果結果還沒準備好，當前線程會等待；準備好後取得返回值。",[10,507,508],{},"輸出可能是：",[38,510,513],{"className":511,"code":512,"language":123,"meta":43},[121],"main continues\n30\n",[13,514,512],{"__ignoreMap":43},[105,516,518,519,521,522,525],{"id":517},"_3-async-的參數和-thread-很像","3. ",[13,520,347],{}," 的參數和 ",[13,523,524],{},"thread"," 很像",[10,527,528],{},"概念上：",[38,530,532],{"className":40,"code":531,"language":42,"meta":43,"style":43},"std::async(policy, callable, arg1, arg2, ...)\n",[13,533,534],{"__ignoreMap":43},[47,535,536,538,540,542],{"class":49,"line":50},[47,537,54],{"class":53},[47,539,344],{"class":57},[47,541,347],{"class":53},[47,543,544],{"class":57},"(policy, callable, arg1, arg2, ...)\n",[10,546,547],{},"其中：",[18,549,550,556,562],{},[21,551,552,555],{},[13,553,554],{},"policy","：啓動策略；",[21,557,558,561],{},[13,559,560],{},"callable","：要執行的可調用對象；",[21,563,564],{},"後續參數：傳給該可調用對象。",[10,566,567],{},"可調用對象同樣可以是：",[18,569,570,573,576,579],{},[21,571,572],{},"普通函數；",[21,574,575],{},"Lambda；",[21,577,578],{},"函數對象；",[21,580,581],{},"成員函數。",[105,583,585,586,589,590],{"id":584},"_4-stdlaunchasync-和-stdlaunchdeferred","4. ",[13,587,588],{},"std::launch::async"," 和 ",[13,591,592],{},"std::launch::deferred",[10,594,595,597],{},[13,596,221],{}," 支持兩種重要啓動策略。",[599,600,602,603],"h3",{"id":601},"_41-stdlaunchasync","4.1 ",[13,604,588],{},[38,606,608],{"className":40,"code":607,"language":42,"meta":43,"style":43},"std::async(std::launch::async, task);\n",[13,609,610],{"__ignoreMap":43},[47,611,612,614,616,618,620,622,624,626],{"class":49,"line":50},[47,613,54],{"class":53},[47,615,344],{"class":57},[47,617,347],{"class":53},[47,619,258],{"class":57},[47,621,54],{"class":53},[47,623,344],{"class":57},[47,625,361],{"class":53},[47,627,628],{"class":57},"::async, task);\n",[10,630,631],{},"要求任務異步執行。",[10,633,634],{},"可以把它理解成：",[95,636,637],{},[10,638,639],{},"現在就安排任務獨立執行。",[599,641,643,644],{"id":642},"_42-stdlaunchdeferred","4.2 ",[13,645,592],{},[38,647,649],{"className":40,"code":648,"language":42,"meta":43,"style":43},"std::async(std::launch::deferred, task);\n",[13,650,651],{"__ignoreMap":43},[47,652,653,655,657,659,661,663,665,667],{"class":49,"line":50},[47,654,54],{"class":53},[47,656,344],{"class":57},[47,658,347],{"class":53},[47,660,258],{"class":57},[47,662,54],{"class":53},[47,664,344],{"class":57},[47,666,361],{"class":53},[47,668,669],{"class":57},"::deferred, task);\n",[10,671,672],{},"表示延遲執行。",[10,674,675],{},"任務不會立刻運行，而是在第一次：",[38,677,679],{"className":40,"code":678,"language":42,"meta":43,"style":43},"future.get()\nfuture.wait()\n",[13,680,681,690],{"__ignoreMap":43},[47,682,683,686,688],{"class":49,"line":50},[47,684,685],{"class":57},"future.",[47,687,183],{"class":53},[47,689,186],{"class":57},[47,691,692,694,696],{"class":49,"line":61},[47,693,685],{"class":57},[47,695,191],{"class":53},[47,697,186],{"class":57},[10,699,700],{},"時，由調用這些函數的線程執行。",[10,702,128],{},[38,704,706],{"className":40,"code":705,"language":42,"meta":43,"style":43},"#include \u003Cfuture>\n#include \u003Ciostream>\n#include \u003Cthread>\n\nint task()\n{\n    std::cout \u003C\u003C \"task thread: \"\n              \u003C\u003C std::this_thread::get_id()\n              \u003C\u003C '\\n';\n    return 42;\n}\n\nint main()\n{\n    std::cout \u003C\u003C \"main thread: \"\n              \u003C\u003C std::this_thread::get_id()\n              \u003C\u003C '\\n';\n\n    auto result = std::async(std::launch::deferred, task);\n\n    std::cout \u003C\u003C result.get() \u003C\u003C '\\n';\n}\n",[13,707,708,714,720,727,731,740,744,755,774,786,795,799,803,811,815,826,842,854,858,883,888,913],{"__ignoreMap":43},[47,709,710,712],{"class":49,"line":50},[47,711,231],{"class":143},[47,713,235],{"class":234},[47,715,716,718],{"class":49,"line":61},[47,717,231],{"class":143},[47,719,242],{"class":234},[47,721,722,724],{"class":49,"line":69},[47,723,231],{"class":143},[47,725,726],{"class":234}," \u003Cthread>\n",[47,728,729],{"class":49,"line":77},[47,730,248],{"emptyLinePlaceholder":247},[47,732,733,735,738],{"class":49,"line":85},[47,734,150],{"class":143},[47,736,737],{"class":53}," task",[47,739,186],{"class":57},[47,741,742],{"class":49,"line":283},[47,743,280],{"class":57},[47,745,746,748,750,752],{"class":49,"line":298},[47,747,327],{"class":53},[47,749,402],{"class":57},[47,751,405],{"class":143},[47,753,754],{"class":234}," \"task thread: \"\n",[47,756,757,760,762,764,767,769,772],{"class":49,"line":304},[47,758,759],{"class":143},"              \u003C\u003C",[47,761,341],{"class":53},[47,763,344],{"class":57},[47,765,766],{"class":53},"this_thread",[47,768,344],{"class":57},[47,770,771],{"class":53},"get_id",[47,773,186],{"class":57},[47,775,776,778,780,782,784],{"class":49,"line":309},[47,777,759],{"class":143},[47,779,439],{"class":234},[47,781,411],{"class":376},[47,783,444],{"class":234},[47,785,417],{"class":57},[47,787,788,790,793],{"class":49,"line":319},[47,789,286],{"class":143},[47,791,792],{"class":376}," 42",[47,794,417],{"class":57},[47,796,797],{"class":49,"line":324},[47,798,301],{"class":57},[47,800,801],{"class":49,"line":353},[47,802,248],{"emptyLinePlaceholder":247},[47,804,805,807,809],{"class":49,"line":367},[47,806,150],{"class":143},[47,808,314],{"class":53},[47,810,186],{"class":57},[47,812,813],{"class":49,"line":373},[47,814,280],{"class":57},[47,816,817,819,821,823],{"class":49,"line":383},[47,818,327],{"class":53},[47,820,402],{"class":57},[47,822,405],{"class":143},[47,824,825],{"class":234}," \"main thread: \"\n",[47,827,828,830,832,834,836,838,840],{"class":49,"line":392},[47,829,759],{"class":143},[47,831,341],{"class":53},[47,833,344],{"class":57},[47,835,766],{"class":53},[47,837,344],{"class":57},[47,839,771],{"class":53},[47,841,186],{"class":57},[47,843,844,846,848,850,852],{"class":49,"line":397},[47,845,759],{"class":143},[47,847,439],{"class":234},[47,849,411],{"class":376},[47,851,444],{"class":234},[47,853,417],{"class":57},[47,855,856],{"class":49,"line":420},[47,857,248],{"emptyLinePlaceholder":247},[47,859,860,863,865,867,869,871,873,875,877,879,881],{"class":49,"line":449},[47,861,862],{"class":143},"    auto",[47,864,335],{"class":57},[47,866,338],{"class":143},[47,868,341],{"class":53},[47,870,344],{"class":57},[47,872,347],{"class":53},[47,874,258],{"class":57},[47,876,54],{"class":53},[47,878,344],{"class":57},[47,880,361],{"class":53},[47,882,669],{"class":57},[47,884,886],{"class":49,"line":885},20,[47,887,248],{"emptyLinePlaceholder":247},[47,889,891,893,895,897,899,901,903,905,907,909,911],{"class":49,"line":890},21,[47,892,327],{"class":53},[47,894,402],{"class":57},[47,896,405],{"class":143},[47,898,429],{"class":57},[47,900,183],{"class":53},[47,902,434],{"class":57},[47,904,405],{"class":143},[47,906,439],{"class":234},[47,908,411],{"class":376},[47,910,444],{"class":234},[47,912,417],{"class":57},[47,914,916],{"class":49,"line":915},22,[47,917,301],{"class":57},[10,919,920,921,924,925,928],{},"這裏 ",[13,922,923],{},"task()"," 會在調用 ",[13,926,927],{},"get()"," 的線程中執行。",[105,930,932],{"id":931},"_5-不寫-policy-會怎樣","5. 不寫 policy 會怎樣",[10,934,935],{},"可以寫：",[38,937,939],{"className":40,"code":938,"language":42,"meta":43,"style":43},"auto result = std::async(task);\n",[13,940,941],{"__ignoreMap":43},[47,942,943,946,948,950,952,954,956],{"class":49,"line":50},[47,944,945],{"class":143},"auto",[47,947,335],{"class":57},[47,949,338],{"class":143},[47,951,341],{"class":53},[47,953,344],{"class":57},[47,955,347],{"class":53},[47,957,958],{"class":57},"(task);\n",[10,960,961],{},"此時標準庫允許實現選擇：",[38,963,966],{"className":964,"code":965,"language":123,"meta":43},[121],"async\n或\ndeferred\n",[13,967,965],{"__ignoreMap":43},[10,969,970],{},"因此，如果你明確要求任務真正異步執行，建議顯式寫：",[38,972,974],{"className":40,"code":973,"language":42,"meta":43,"style":43},"std::launch::async\n",[13,975,976],{"__ignoreMap":43},[47,977,978,980,982,984],{"class":49,"line":50},[47,979,54],{"class":53},[47,981,344],{"class":57},[47,983,361],{"class":53},[47,985,66],{"class":57},[10,987,988],{},"否則不要假設“不寫策略就一定創建新線程”。",[105,990,992,993,996],{"id":991},"_6-futureget-只能取得一次","6. ",[13,994,995],{},"future::get()"," 只能取得一次",[10,998,999,1000,1003,1004,1006],{},"普通 ",[13,1001,1002],{},"std::future"," 的結果通常只能 ",[13,1005,927],{}," 一次：",[38,1008,1010],{"className":40,"code":1009,"language":42,"meta":43,"style":43},"auto result = std::async(std::launch::async, [] {\n    return 42;\n});\n\nint value = result.get();\n\u002F\u002F result.get(); \u002F\u002F 不应再次 get\n",[13,1011,1012,1037,1045,1050,1054,1070],{"__ignoreMap":43},[47,1013,1014,1016,1018,1020,1022,1024,1026,1028,1030,1032,1034],{"class":49,"line":50},[47,1015,945],{"class":143},[47,1017,335],{"class":57},[47,1019,338],{"class":143},[47,1021,341],{"class":53},[47,1023,344],{"class":57},[47,1025,347],{"class":53},[47,1027,258],{"class":57},[47,1029,54],{"class":53},[47,1031,344],{"class":57},[47,1033,361],{"class":53},[47,1035,1036],{"class":57},"::async, [] {\n",[47,1038,1039,1041,1043],{"class":49,"line":61},[47,1040,286],{"class":143},[47,1042,792],{"class":376},[47,1044,417],{"class":57},[47,1046,1047],{"class":49,"line":69},[47,1048,1049],{"class":57},"});\n",[47,1051,1052],{"class":49,"line":77},[47,1053,248],{"emptyLinePlaceholder":247},[47,1055,1056,1058,1061,1063,1065,1067],{"class":49,"line":85},[47,1057,150],{"class":143},[47,1059,1060],{"class":57}," value ",[47,1062,338],{"class":143},[47,1064,429],{"class":57},[47,1066,183],{"class":53},[47,1068,1069],{"class":57},"();\n",[47,1071,1072,1076],{"class":49,"line":283},[47,1073,1075],{"class":1074},"sJ8bj","\u002F\u002F result.get();",[47,1077,1078],{"class":1074}," \u002F\u002F 不应再次 get\n",[10,1080,1081,1082,1084],{},"第一次 ",[13,1083,927],{}," 後，future 通常不再關聯共享狀態。",[10,1086,1087],{},"可以用：",[38,1089,1091],{"className":40,"code":1090,"language":42,"meta":43,"style":43},"result.valid()\n",[13,1092,1093],{"__ignoreMap":43},[47,1094,1095,1097,1099],{"class":49,"line":50},[47,1096,498],{"class":57},[47,1098,212],{"class":53},[47,1100,186],{"class":57},[10,1102,1103],{},"檢查它是否仍然關聯有效狀態。",[105,1105,1107,1108,1111],{"id":1106},"_7-wait只等待不取結果","7. ",[13,1109,1110],{},"wait()","：只等待，不取結果",[38,1113,1115],{"className":40,"code":1114,"language":42,"meta":43,"style":43},"future.wait();\n",[13,1116,1117],{"__ignoreMap":43},[47,1118,1119,1121,1123],{"class":49,"line":50},[47,1120,685],{"class":57},[47,1122,191],{"class":53},[47,1124,1069],{"class":57},[10,1126,1127],{},"只等待任務完成，不消費結果。",[10,1129,1130],{},"之後仍然可以：",[38,1132,1134],{"className":40,"code":1133,"language":42,"meta":43,"style":43},"future.get();\n",[13,1135,1136],{"__ignoreMap":43},[47,1137,1138,1140,1142],{"class":49,"line":50},[47,1139,685],{"class":57},[47,1141,183],{"class":53},[47,1143,1069],{"class":57},[10,1145,128],{},[38,1147,1149],{"className":40,"code":1148,"language":42,"meta":43,"style":43},"result.wait();\nstd::cout \u003C\u003C \"ready\\n\";\nstd::cout \u003C\u003C result.get() \u003C\u003C '\\n';\n",[13,1150,1151,1159,1176],{"__ignoreMap":43},[47,1152,1153,1155,1157],{"class":49,"line":50},[47,1154,498],{"class":57},[47,1156,191],{"class":53},[47,1158,1069],{"class":57},[47,1160,1161,1163,1165,1167,1170,1172,1174],{"class":49,"line":61},[47,1162,54],{"class":53},[47,1164,402],{"class":57},[47,1166,405],{"class":143},[47,1168,1169],{"class":234}," \"ready",[47,1171,411],{"class":376},[47,1173,414],{"class":234},[47,1175,417],{"class":57},[47,1177,1178,1180,1182,1184,1186,1188,1190,1192,1194,1196,1198],{"class":49,"line":69},[47,1179,54],{"class":53},[47,1181,402],{"class":57},[47,1183,405],{"class":143},[47,1185,429],{"class":57},[47,1187,183],{"class":53},[47,1189,434],{"class":57},[47,1191,405],{"class":143},[47,1193,439],{"class":234},[47,1195,411],{"class":376},[47,1197,444],{"class":234},[47,1199,417],{"class":57},[105,1201,1203,1204,1207],{"id":1202},"_8-wait_for等待一段時間","8. ",[13,1205,1206],{},"wait_for()","：等待一段時間",[38,1209,1211],{"className":40,"code":1210,"language":42,"meta":43,"style":43},"auto status = result.wait_for(std::chrono::milliseconds(100));\n",[13,1212,1213],{"__ignoreMap":43},[47,1214,1215,1217,1220,1222,1224,1226,1228,1230,1232,1235,1237,1240,1242,1245],{"class":49,"line":50},[47,1216,945],{"class":143},[47,1218,1219],{"class":57}," status ",[47,1221,338],{"class":143},[47,1223,429],{"class":57},[47,1225,198],{"class":53},[47,1227,258],{"class":57},[47,1229,54],{"class":53},[47,1231,344],{"class":57},[47,1233,1234],{"class":53},"chrono",[47,1236,344],{"class":57},[47,1238,1239],{"class":53},"milliseconds",[47,1241,258],{"class":57},[47,1243,1244],{"class":376},"100",[47,1246,1247],{"class":57},"));\n",[10,1249,1250],{},"返回：",[38,1252,1254],{"className":40,"code":1253,"language":42,"meta":43,"style":43},"std::future_status::ready\nstd::future_status::timeout\nstd::future_status::deferred\n",[13,1255,1256,1268,1279],{"__ignoreMap":43},[47,1257,1258,1260,1262,1265],{"class":49,"line":50},[47,1259,54],{"class":53},[47,1261,344],{"class":57},[47,1263,1264],{"class":53},"future_status",[47,1266,1267],{"class":57},"::ready\n",[47,1269,1270,1272,1274,1276],{"class":49,"line":61},[47,1271,54],{"class":53},[47,1273,344],{"class":57},[47,1275,1264],{"class":53},[47,1277,1278],{"class":57},"::timeout\n",[47,1280,1281,1283,1285,1287],{"class":49,"line":69},[47,1282,54],{"class":53},[47,1284,344],{"class":57},[47,1286,1264],{"class":53},[47,1288,1289],{"class":57},"::deferred\n",[10,1291,1292],{},"示例：",[38,1294,1296],{"className":40,"code":1295,"language":42,"meta":43,"style":43},"#include \u003Cchrono>\n#include \u003Cfuture>\n#include \u003Ciostream>\n#include \u003Cthread>\n\nusing namespace std::chrono_literals;\n\nint main()\n{\n    auto result = std::async(std::launch::async, [] {\n        std::this_thread::sleep_for(1s);\n        return 42;\n    });\n\n    if (result.wait_for(100ms) == std::future_status::timeout)\n    {\n        std::cout \u003C\u003C \"not ready yet\\n\";\n    }\n\n    std::cout \u003C\u003C result.get() \u003C\u003C '\\n';\n}\n",[13,1297,1298,1305,1311,1317,1323,1327,1344,1348,1356,1360,1384,1407,1416,1421,1425,1457,1462,1479,1484,1488,1512],{"__ignoreMap":43},[47,1299,1300,1302],{"class":49,"line":50},[47,1301,231],{"class":143},[47,1303,1304],{"class":234}," \u003Cchrono>\n",[47,1306,1307,1309],{"class":49,"line":61},[47,1308,231],{"class":143},[47,1310,235],{"class":234},[47,1312,1313,1315],{"class":49,"line":69},[47,1314,231],{"class":143},[47,1316,242],{"class":234},[47,1318,1319,1321],{"class":49,"line":77},[47,1320,231],{"class":143},[47,1322,726],{"class":234},[47,1324,1325],{"class":49,"line":85},[47,1326,248],{"emptyLinePlaceholder":247},[47,1328,1329,1332,1335,1337,1339,1342],{"class":49,"line":283},[47,1330,1331],{"class":143},"using",[47,1333,1334],{"class":143}," namespace",[47,1336,341],{"class":53},[47,1338,344],{"class":57},[47,1340,1341],{"class":53},"chrono_literals",[47,1343,417],{"class":57},[47,1345,1346],{"class":49,"line":298},[47,1347,248],{"emptyLinePlaceholder":247},[47,1349,1350,1352,1354],{"class":49,"line":304},[47,1351,150],{"class":143},[47,1353,314],{"class":53},[47,1355,186],{"class":57},[47,1357,1358],{"class":49,"line":309},[47,1359,280],{"class":57},[47,1361,1362,1364,1366,1368,1370,1372,1374,1376,1378,1380,1382],{"class":49,"line":319},[47,1363,862],{"class":143},[47,1365,335],{"class":57},[47,1367,338],{"class":143},[47,1369,341],{"class":53},[47,1371,344],{"class":57},[47,1373,347],{"class":53},[47,1375,258],{"class":57},[47,1377,54],{"class":53},[47,1379,344],{"class":57},[47,1381,361],{"class":53},[47,1383,1036],{"class":57},[47,1385,1386,1388,1390,1392,1394,1397,1399,1402,1405],{"class":49,"line":324},[47,1387,356],{"class":53},[47,1389,344],{"class":57},[47,1391,766],{"class":53},[47,1393,344],{"class":57},[47,1395,1396],{"class":53},"sleep_for",[47,1398,258],{"class":57},[47,1400,1401],{"class":376},"1",[47,1403,1404],{"class":143},"s",[47,1406,389],{"class":57},[47,1408,1409,1412,1414],{"class":49,"line":353},[47,1410,1411],{"class":143},"        return",[47,1413,792],{"class":376},[47,1415,417],{"class":57},[47,1417,1418],{"class":49,"line":367},[47,1419,1420],{"class":57},"    });\n",[47,1422,1423],{"class":49,"line":373},[47,1424,248],{"emptyLinePlaceholder":247},[47,1426,1427,1430,1433,1435,1437,1439,1442,1445,1448,1450,1452,1454],{"class":49,"line":383},[47,1428,1429],{"class":143},"    if",[47,1431,1432],{"class":57}," (result.",[47,1434,198],{"class":53},[47,1436,258],{"class":57},[47,1438,1244],{"class":376},[47,1440,1441],{"class":143},"ms",[47,1443,1444],{"class":57},") ",[47,1446,1447],{"class":143},"==",[47,1449,341],{"class":53},[47,1451,344],{"class":57},[47,1453,1264],{"class":53},[47,1455,1456],{"class":57},"::timeout)\n",[47,1458,1459],{"class":49,"line":392},[47,1460,1461],{"class":57},"    {\n",[47,1463,1464,1466,1468,1470,1473,1475,1477],{"class":49,"line":397},[47,1465,356],{"class":53},[47,1467,402],{"class":57},[47,1469,405],{"class":143},[47,1471,1472],{"class":234}," \"not ready yet",[47,1474,411],{"class":376},[47,1476,414],{"class":234},[47,1478,417],{"class":57},[47,1480,1481],{"class":49,"line":420},[47,1482,1483],{"class":57},"    }\n",[47,1485,1486],{"class":49,"line":449},[47,1487,248],{"emptyLinePlaceholder":247},[47,1489,1490,1492,1494,1496,1498,1500,1502,1504,1506,1508,1510],{"class":49,"line":885},[47,1491,327],{"class":53},[47,1493,402],{"class":57},[47,1495,405],{"class":143},[47,1497,429],{"class":57},[47,1499,183],{"class":53},[47,1501,434],{"class":57},[47,1503,405],{"class":143},[47,1505,439],{"class":234},[47,1507,411],{"class":376},[47,1509,444],{"class":234},[47,1511,417],{"class":57},[47,1513,1514],{"class":49,"line":890},[47,1515,301],{"class":57},[105,1517,1519],{"id":1518},"_9-異常會通過-future-傳播","9. 異常會通過 future 傳播",[10,1521,1522,1523,1525,1526,1528],{},"這是 ",[13,1524,102],{}," 相比裸 ",[13,1527,15],{}," 很方便的一點。",[10,1530,1531],{},"如果異步任務拋異常：",[38,1533,1535],{"className":40,"code":1534,"language":42,"meta":43,"style":43},"#include \u003Cfuture>\n#include \u003Ciostream>\n#include \u003Cstdexcept>\n\nint main()\n{\n    auto result = std::async(std::launch::async, []() -> int {\n        throw std::runtime_error(\"task failed\");\n    });\n\n    try\n    {\n        std::cout \u003C\u003C result.get() \u003C\u003C '\\n';\n    }\n    catch (const std::exception& e)\n    {\n        std::cout \u003C\u003C e.what() \u003C\u003C '\\n';\n    }\n}\n",[13,1536,1537,1543,1549,1556,1560,1568,1572,1602,1621,1625,1629,1634,1638,1662,1666,1688,1692,1718,1722],{"__ignoreMap":43},[47,1538,1539,1541],{"class":49,"line":50},[47,1540,231],{"class":143},[47,1542,235],{"class":234},[47,1544,1545,1547],{"class":49,"line":61},[47,1546,231],{"class":143},[47,1548,242],{"class":234},[47,1550,1551,1553],{"class":49,"line":69},[47,1552,231],{"class":143},[47,1554,1555],{"class":234}," \u003Cstdexcept>\n",[47,1557,1558],{"class":49,"line":77},[47,1559,248],{"emptyLinePlaceholder":247},[47,1561,1562,1564,1566],{"class":49,"line":85},[47,1563,150],{"class":143},[47,1565,314],{"class":53},[47,1567,186],{"class":57},[47,1569,1570],{"class":49,"line":283},[47,1571,280],{"class":57},[47,1573,1574,1576,1578,1580,1582,1584,1586,1588,1590,1592,1594,1597,1599],{"class":49,"line":298},[47,1575,862],{"class":143},[47,1577,335],{"class":57},[47,1579,338],{"class":143},[47,1581,341],{"class":53},[47,1583,344],{"class":57},[47,1585,347],{"class":53},[47,1587,258],{"class":57},[47,1589,54],{"class":53},[47,1591,344],{"class":57},[47,1593,361],{"class":53},[47,1595,1596],{"class":57},"::async, []() -> ",[47,1598,150],{"class":143},[47,1600,1601],{"class":57}," {\n",[47,1603,1604,1607,1609,1611,1614,1616,1619],{"class":49,"line":304},[47,1605,1606],{"class":143},"        throw",[47,1608,341],{"class":53},[47,1610,344],{"class":57},[47,1612,1613],{"class":53},"runtime_error",[47,1615,258],{"class":57},[47,1617,1618],{"class":234},"\"task failed\"",[47,1620,389],{"class":57},[47,1622,1623],{"class":49,"line":309},[47,1624,1420],{"class":57},[47,1626,1627],{"class":49,"line":319},[47,1628,248],{"emptyLinePlaceholder":247},[47,1630,1631],{"class":49,"line":324},[47,1632,1633],{"class":143},"    try\n",[47,1635,1636],{"class":49,"line":353},[47,1637,1461],{"class":57},[47,1639,1640,1642,1644,1646,1648,1650,1652,1654,1656,1658,1660],{"class":49,"line":367},[47,1641,356],{"class":53},[47,1643,402],{"class":57},[47,1645,405],{"class":143},[47,1647,429],{"class":57},[47,1649,183],{"class":53},[47,1651,434],{"class":57},[47,1653,405],{"class":143},[47,1655,439],{"class":234},[47,1657,411],{"class":376},[47,1659,444],{"class":234},[47,1661,417],{"class":57},[47,1663,1664],{"class":49,"line":373},[47,1665,1483],{"class":57},[47,1667,1668,1671,1674,1677,1679,1682,1685],{"class":49,"line":383},[47,1669,1670],{"class":143},"    catch",[47,1672,1673],{"class":57}," (",[47,1675,1676],{"class":143},"const",[47,1678,341],{"class":53},[47,1680,1681],{"class":57},"::exception",[47,1683,1684],{"class":143},"&",[47,1686,1687],{"class":57}," e)\n",[47,1689,1690],{"class":49,"line":392},[47,1691,1461],{"class":57},[47,1693,1694,1696,1698,1700,1703,1706,1708,1710,1712,1714,1716],{"class":49,"line":397},[47,1695,356],{"class":53},[47,1697,402],{"class":57},[47,1699,405],{"class":143},[47,1701,1702],{"class":57}," e.",[47,1704,1705],{"class":53},"what",[47,1707,434],{"class":57},[47,1709,405],{"class":143},[47,1711,439],{"class":234},[47,1713,411],{"class":376},[47,1715,444],{"class":234},[47,1717,417],{"class":57},[47,1719,1720],{"class":49,"line":420},[47,1721,1483],{"class":57},[47,1723,1724],{"class":49,"line":449},[47,1725,301],{"class":57},[10,1727,1728],{},"異常會被保存到共享狀態中，然後在：",[38,1730,1731],{"className":40,"code":491,"language":42,"meta":43,"style":43},[13,1732,1733],{"__ignoreMap":43},[47,1734,1735,1737,1739],{"class":49,"line":50},[47,1736,498],{"class":57},[47,1738,183],{"class":53},[47,1740,186],{"class":57},[10,1742,1743],{},"時重新拋出。",[10,1745,1746],{},"這比讓工作線程自己想辦法把錯誤傳回主線程方便很多。",[105,1748,1750,1751],{"id":1749},"_10-stdpromiset","10. ",[13,1752,1753],{},"std::promise\u003CT>",[10,1755,1756,1758],{},[13,1757,1753],{}," 可以理解成 future 通道的“寫入端”。",[10,1760,1761],{},"對應關係：",[38,1763,1766],{"className":1764,"code":1765,"language":123,"meta":43},[121],"promise\u003CT>  ----写入结果---->  shared state  ----读取结果----> future\u003CT>\n",[13,1767,1765],{"__ignoreMap":43},[10,1769,1770],{},"通過：",[38,1772,1774],{"className":40,"code":1773,"language":42,"meta":43,"style":43},"promise.get_future()\n",[13,1775,1776],{"__ignoreMap":43},[47,1777,1778,1781,1784],{"class":49,"line":50},[47,1779,1780],{"class":57},"promise.",[47,1782,1783],{"class":53},"get_future",[47,1785,186],{"class":57},[10,1787,1788],{},"取得與它關聯的 future。",[10,1790,1292],{},[38,1792,1794],{"className":40,"code":1793,"language":42,"meta":43,"style":43},"#include \u003Cfuture>\n#include \u003Ciostream>\n#include \u003Cthread>\n\nvoid producer(std::promise\u003Cint> promise)\n{\n    promise.set_value(42);\n}\n\nint main()\n{\n    std::promise\u003Cint> promise;\n    std::future\u003Cint> future = promise.get_future();\n\n    std::thread t(producer, std::move(promise));\n\n    std::cout \u003C\u003C future.get() \u003C\u003C '\\n';\n    t.join();\n}\n",[13,1795,1796,1802,1808,1814,1818,1847,1851,1866,1870,1874,1882,1886,1898,1918,1922,1945,1949,1974,1984],{"__ignoreMap":43},[47,1797,1798,1800],{"class":49,"line":50},[47,1799,231],{"class":143},[47,1801,235],{"class":234},[47,1803,1804,1806],{"class":49,"line":61},[47,1805,231],{"class":143},[47,1807,242],{"class":234},[47,1809,1810,1812],{"class":49,"line":69},[47,1811,231],{"class":143},[47,1813,726],{"class":234},[47,1815,1816],{"class":49,"line":77},[47,1817,248],{"emptyLinePlaceholder":247},[47,1819,1820,1823,1826,1828,1830,1832,1835,1838,1840,1843,1845],{"class":49,"line":85},[47,1821,1822],{"class":143},"void",[47,1824,1825],{"class":53}," producer",[47,1827,258],{"class":57},[47,1829,54],{"class":53},[47,1831,344],{"class":57},[47,1833,1834],{"class":53},"promise",[47,1836,1837],{"class":57},"\u003C",[47,1839,150],{"class":143},[47,1841,1842],{"class":57},"> ",[47,1844,1834],{"class":263},[47,1846,275],{"class":57},[47,1848,1849],{"class":49,"line":283},[47,1850,280],{"class":57},[47,1852,1853,1856,1859,1861,1864],{"class":49,"line":298},[47,1854,1855],{"class":57},"    promise.",[47,1857,1858],{"class":53},"set_value",[47,1860,258],{"class":57},[47,1862,1863],{"class":376},"42",[47,1865,389],{"class":57},[47,1867,1868],{"class":49,"line":304},[47,1869,301],{"class":57},[47,1871,1872],{"class":49,"line":309},[47,1873,248],{"emptyLinePlaceholder":247},[47,1875,1876,1878,1880],{"class":49,"line":319},[47,1877,150],{"class":143},[47,1879,314],{"class":53},[47,1881,186],{"class":57},[47,1883,1884],{"class":49,"line":324},[47,1885,280],{"class":57},[47,1887,1888,1890,1893,1895],{"class":49,"line":353},[47,1889,327],{"class":53},[47,1891,1892],{"class":57},"::promise",[47,1894,332],{"class":143},[47,1896,1897],{"class":57}," promise;\n",[47,1899,1900,1902,1904,1906,1909,1911,1914,1916],{"class":49,"line":367},[47,1901,327],{"class":53},[47,1903,140],{"class":57},[47,1905,332],{"class":143},[47,1907,1908],{"class":57}," future ",[47,1910,338],{"class":143},[47,1912,1913],{"class":57}," promise.",[47,1915,1783],{"class":53},[47,1917,1069],{"class":57},[47,1919,1920],{"class":49,"line":373},[47,1921,248],{"emptyLinePlaceholder":247},[47,1923,1924,1926,1929,1932,1935,1937,1939,1942],{"class":49,"line":383},[47,1925,327],{"class":53},[47,1927,1928],{"class":57},"::thread ",[47,1930,1931],{"class":53},"t",[47,1933,1934],{"class":57},"(producer, ",[47,1936,54],{"class":53},[47,1938,344],{"class":57},[47,1940,1941],{"class":53},"move",[47,1943,1944],{"class":57},"(promise));\n",[47,1946,1947],{"class":49,"line":392},[47,1948,248],{"emptyLinePlaceholder":247},[47,1950,1951,1953,1955,1957,1960,1962,1964,1966,1968,1970,1972],{"class":49,"line":397},[47,1952,327],{"class":53},[47,1954,402],{"class":57},[47,1956,405],{"class":143},[47,1958,1959],{"class":57}," future.",[47,1961,183],{"class":53},[47,1963,434],{"class":57},[47,1965,405],{"class":143},[47,1967,439],{"class":234},[47,1969,411],{"class":376},[47,1971,444],{"class":234},[47,1973,417],{"class":57},[47,1975,1976,1979,1982],{"class":49,"line":420},[47,1977,1978],{"class":57},"    t.",[47,1980,1981],{"class":53},"join",[47,1983,1069],{"class":57},[47,1985,1986],{"class":49,"line":449},[47,1987,301],{"class":57},[10,1989,1990,1991,1994],{},"注意 ",[13,1992,1993],{},"std::promise"," 不能隨意複製，因此這裏通過：",[38,1996,1998],{"className":40,"code":1997,"language":42,"meta":43,"style":43},"std::move(promise)\n",[13,1999,2000],{"__ignoreMap":43},[47,2001,2002,2004,2006,2008],{"class":49,"line":50},[47,2003,54],{"class":53},[47,2005,344],{"class":57},[47,2007,1941],{"class":53},[47,2009,2010],{"class":57},"(promise)\n",[10,2012,2013],{},"把 promise 的所有權移動到工作線程。",[105,2015,2017,2018],{"id":2016},"_11-promiseset_value","11. ",[13,2019,2020],{},"promise::set_value()",[38,2022,2024],{"className":40,"code":2023,"language":42,"meta":43,"style":43},"promise.set_value(value);\n",[13,2025,2026],{"__ignoreMap":43},[47,2027,2028,2030,2032],{"class":49,"line":50},[47,2029,1780],{"class":57},[47,2031,1858],{"class":53},[47,2033,2034],{"class":57},"(value);\n",[10,2036,2037],{},"向共享狀態寫入結果。",[10,2039,2040,2041,2044],{},"對於 ",[13,2042,2043],{},"std::promise\u003Cvoid>","：",[38,2046,2048],{"className":40,"code":2047,"language":42,"meta":43,"style":43},"promise.set_value();\n",[13,2049,2050],{"__ignoreMap":43},[47,2051,2052,2054,2056],{"class":49,"line":50},[47,2053,1780],{"class":57},[47,2055,1858],{"class":53},[47,2057,1069],{"class":57},[10,2059,2060],{},"表示任務成功完成，但沒有具體返回值。",[105,2062,2064,2065],{"id":2063},"_12-promiseset_exception","12. ",[13,2066,2067],{},"promise::set_exception()",[10,2069,2070],{},"promise 也可以主動寫入異常：",[38,2072,2074],{"className":40,"code":2073,"language":42,"meta":43,"style":43},"try\n{\n    ...\n}\ncatch (...)\n{\n    promise.set_exception(std::current_exception());\n}\n",[13,2075,2076,2081,2085,2090,2094,2102,2106,2125],{"__ignoreMap":43},[47,2077,2078],{"class":49,"line":50},[47,2079,2080],{"class":143},"try\n",[47,2082,2083],{"class":49,"line":61},[47,2084,280],{"class":57},[47,2086,2087],{"class":49,"line":69},[47,2088,2089],{"class":57},"    ...\n",[47,2091,2092],{"class":49,"line":77},[47,2093,301],{"class":57},[47,2095,2096,2099],{"class":49,"line":85},[47,2097,2098],{"class":143},"catch",[47,2100,2101],{"class":57}," (...)\n",[47,2103,2104],{"class":49,"line":283},[47,2105,280],{"class":57},[47,2107,2108,2110,2113,2115,2117,2119,2122],{"class":49,"line":298},[47,2109,1855],{"class":57},[47,2111,2112],{"class":53},"set_exception",[47,2114,258],{"class":57},[47,2116,54],{"class":53},[47,2118,344],{"class":57},[47,2120,2121],{"class":53},"current_exception",[47,2123,2124],{"class":57},"());\n",[47,2126,2127],{"class":49,"line":304},[47,2128,301],{"class":57},[10,2130,2131],{},"之後 future 調用：",[38,2133,2135],{"className":40,"code":2134,"language":42,"meta":43,"style":43},"future.get()\n",[13,2136,2137],{"__ignoreMap":43},[47,2138,2139,2141,2143],{"class":49,"line":50},[47,2140,685],{"class":57},[47,2142,183],{"class":53},[47,2144,186],{"class":57},[10,2146,2147],{},"會重新拋出這個異常。",[10,2149,2150],{},"完整示例：",[38,2152,2154],{"className":40,"code":2153,"language":42,"meta":43,"style":43},"#include \u003Cexception>\n#include \u003Cfuture>\n#include \u003Ciostream>\n#include \u003Cstdexcept>\n#include \u003Cthread>\n\nvoid producer(std::promise\u003Cint> promise)\n{\n    try\n    {\n        throw std::runtime_error(\"failed\");\n    }\n    catch (...)\n    {\n        promise.set_exception(std::current_exception());\n    }\n}\n\nint main()\n{\n    std::promise\u003Cint> promise;\n    auto future = promise.get_future();\n\n    std::thread t(producer, std::move(promise));\n\n    try\n    {\n        std::cout \u003C\u003C future.get() \u003C\u003C '\\n';\n    }\n    catch (const std::exception& e)\n    {\n        std::cout \u003C\u003C e.what() \u003C\u003C '\\n';\n    }\n\n    t.join();\n}\n",[13,2155,2156,2163,2169,2175,2181,2187,2191,2215,2219,2223,2227,2244,2248,2254,2258,2275,2279,2283,2287,2295,2299,2309,2323,2328,2347,2352,2357,2362,2387,2392,2409,2414,2439,2444,2449,2458],{"__ignoreMap":43},[47,2157,2158,2160],{"class":49,"line":50},[47,2159,231],{"class":143},[47,2161,2162],{"class":234}," \u003Cexception>\n",[47,2164,2165,2167],{"class":49,"line":61},[47,2166,231],{"class":143},[47,2168,235],{"class":234},[47,2170,2171,2173],{"class":49,"line":69},[47,2172,231],{"class":143},[47,2174,242],{"class":234},[47,2176,2177,2179],{"class":49,"line":77},[47,2178,231],{"class":143},[47,2180,1555],{"class":234},[47,2182,2183,2185],{"class":49,"line":85},[47,2184,231],{"class":143},[47,2186,726],{"class":234},[47,2188,2189],{"class":49,"line":283},[47,2190,248],{"emptyLinePlaceholder":247},[47,2192,2193,2195,2197,2199,2201,2203,2205,2207,2209,2211,2213],{"class":49,"line":298},[47,2194,1822],{"class":143},[47,2196,1825],{"class":53},[47,2198,258],{"class":57},[47,2200,54],{"class":53},[47,2202,344],{"class":57},[47,2204,1834],{"class":53},[47,2206,1837],{"class":57},[47,2208,150],{"class":143},[47,2210,1842],{"class":57},[47,2212,1834],{"class":263},[47,2214,275],{"class":57},[47,2216,2217],{"class":49,"line":304},[47,2218,280],{"class":57},[47,2220,2221],{"class":49,"line":309},[47,2222,1633],{"class":143},[47,2224,2225],{"class":49,"line":319},[47,2226,1461],{"class":57},[47,2228,2229,2231,2233,2235,2237,2239,2242],{"class":49,"line":324},[47,2230,1606],{"class":143},[47,2232,341],{"class":53},[47,2234,344],{"class":57},[47,2236,1613],{"class":53},[47,2238,258],{"class":57},[47,2240,2241],{"class":234},"\"failed\"",[47,2243,389],{"class":57},[47,2245,2246],{"class":49,"line":353},[47,2247,1483],{"class":57},[47,2249,2250,2252],{"class":49,"line":367},[47,2251,1670],{"class":143},[47,2253,2101],{"class":57},[47,2255,2256],{"class":49,"line":373},[47,2257,1461],{"class":57},[47,2259,2260,2263,2265,2267,2269,2271,2273],{"class":49,"line":383},[47,2261,2262],{"class":57},"        promise.",[47,2264,2112],{"class":53},[47,2266,258],{"class":57},[47,2268,54],{"class":53},[47,2270,344],{"class":57},[47,2272,2121],{"class":53},[47,2274,2124],{"class":57},[47,2276,2277],{"class":49,"line":392},[47,2278,1483],{"class":57},[47,2280,2281],{"class":49,"line":397},[47,2282,301],{"class":57},[47,2284,2285],{"class":49,"line":420},[47,2286,248],{"emptyLinePlaceholder":247},[47,2288,2289,2291,2293],{"class":49,"line":449},[47,2290,150],{"class":143},[47,2292,314],{"class":53},[47,2294,186],{"class":57},[47,2296,2297],{"class":49,"line":885},[47,2298,280],{"class":57},[47,2300,2301,2303,2305,2307],{"class":49,"line":890},[47,2302,327],{"class":53},[47,2304,1892],{"class":57},[47,2306,332],{"class":143},[47,2308,1897],{"class":57},[47,2310,2311,2313,2315,2317,2319,2321],{"class":49,"line":915},[47,2312,862],{"class":143},[47,2314,1908],{"class":57},[47,2316,338],{"class":143},[47,2318,1913],{"class":57},[47,2320,1783],{"class":53},[47,2322,1069],{"class":57},[47,2324,2326],{"class":49,"line":2325},23,[47,2327,248],{"emptyLinePlaceholder":247},[47,2329,2331,2333,2335,2337,2339,2341,2343,2345],{"class":49,"line":2330},24,[47,2332,327],{"class":53},[47,2334,1928],{"class":57},[47,2336,1931],{"class":53},[47,2338,1934],{"class":57},[47,2340,54],{"class":53},[47,2342,344],{"class":57},[47,2344,1941],{"class":53},[47,2346,1944],{"class":57},[47,2348,2350],{"class":49,"line":2349},25,[47,2351,248],{"emptyLinePlaceholder":247},[47,2353,2355],{"class":49,"line":2354},26,[47,2356,1633],{"class":143},[47,2358,2360],{"class":49,"line":2359},27,[47,2361,1461],{"class":57},[47,2363,2365,2367,2369,2371,2373,2375,2377,2379,2381,2383,2385],{"class":49,"line":2364},28,[47,2366,356],{"class":53},[47,2368,402],{"class":57},[47,2370,405],{"class":143},[47,2372,1959],{"class":57},[47,2374,183],{"class":53},[47,2376,434],{"class":57},[47,2378,405],{"class":143},[47,2380,439],{"class":234},[47,2382,411],{"class":376},[47,2384,444],{"class":234},[47,2386,417],{"class":57},[47,2388,2390],{"class":49,"line":2389},29,[47,2391,1483],{"class":57},[47,2393,2395,2397,2399,2401,2403,2405,2407],{"class":49,"line":2394},30,[47,2396,1670],{"class":143},[47,2398,1673],{"class":57},[47,2400,1676],{"class":143},[47,2402,341],{"class":53},[47,2404,1681],{"class":57},[47,2406,1684],{"class":143},[47,2408,1687],{"class":57},[47,2410,2412],{"class":49,"line":2411},31,[47,2413,1461],{"class":57},[47,2415,2417,2419,2421,2423,2425,2427,2429,2431,2433,2435,2437],{"class":49,"line":2416},32,[47,2418,356],{"class":53},[47,2420,402],{"class":57},[47,2422,405],{"class":143},[47,2424,1702],{"class":57},[47,2426,1705],{"class":53},[47,2428,434],{"class":57},[47,2430,405],{"class":143},[47,2432,439],{"class":234},[47,2434,411],{"class":376},[47,2436,444],{"class":234},[47,2438,417],{"class":57},[47,2440,2442],{"class":49,"line":2441},33,[47,2443,1483],{"class":57},[47,2445,2447],{"class":49,"line":2446},34,[47,2448,248],{"emptyLinePlaceholder":247},[47,2450,2452,2454,2456],{"class":49,"line":2451},35,[47,2453,1978],{"class":57},[47,2455,1981],{"class":53},[47,2457,1069],{"class":57},[47,2459,2461],{"class":49,"line":2460},36,[47,2462,301],{"class":57},[105,2464,2466],{"id":2465},"_13-什麼是-broken-promise","13. 什麼是 broken promise",[10,2468,2469,2470,2472],{},"如果 ",[13,2471,1834],{}," 在既沒有：",[38,2474,2476],{"className":40,"code":2475,"language":42,"meta":43,"style":43},"set_value()\n",[13,2477,2478],{"__ignoreMap":43},[47,2479,2480,2482],{"class":49,"line":50},[47,2481,1858],{"class":53},[47,2483,186],{"class":57},[10,2485,2486],{},"也沒有：",[38,2488,2490],{"className":40,"code":2489,"language":42,"meta":43,"style":43},"set_exception()\n",[13,2491,2492],{"__ignoreMap":43},[47,2493,2494,2496],{"class":49,"line":50},[47,2495,2112],{"class":53},[47,2497,186],{"class":57},[10,2499,2500],{},"的情況下被銷燬，那麼對應 future 不會永遠傻等。",[10,2502,2503],{},"它會得到一個“broken promise”錯誤狀態。",[10,2505,128],{},[38,2507,2509],{"className":40,"code":2508,"language":42,"meta":43,"style":43},"std::future\u003Cint> future;\n\n{\n    std::promise\u003Cint> promise;\n    future = promise.get_future();\n} \u002F\u002F promise 销毁，但没有写入结果\n\nfuture.get(); \u002F\u002F 抛出 std::future_error\n",[13,2510,2511,2522,2526,2530,2540,2553,2561,2565],{"__ignoreMap":43},[47,2512,2513,2515,2517,2519],{"class":49,"line":50},[47,2514,54],{"class":53},[47,2516,140],{"class":57},[47,2518,332],{"class":143},[47,2520,2521],{"class":57}," future;\n",[47,2523,2524],{"class":49,"line":61},[47,2525,248],{"emptyLinePlaceholder":247},[47,2527,2528],{"class":49,"line":69},[47,2529,280],{"class":57},[47,2531,2532,2534,2536,2538],{"class":49,"line":77},[47,2533,327],{"class":53},[47,2535,1892],{"class":57},[47,2537,332],{"class":143},[47,2539,1897],{"class":57},[47,2541,2542,2545,2547,2549,2551],{"class":49,"line":85},[47,2543,2544],{"class":57},"    future ",[47,2546,338],{"class":143},[47,2548,1913],{"class":57},[47,2550,1783],{"class":53},[47,2552,1069],{"class":57},[47,2554,2555,2558],{"class":49,"line":283},[47,2556,2557],{"class":57},"}",[47,2559,2560],{"class":1074}," \u002F\u002F promise 销毁，但没有写入结果\n",[47,2562,2563],{"class":49,"line":298},[47,2564,248],{"emptyLinePlaceholder":247},[47,2566,2567,2569,2571,2574],{"class":49,"line":304},[47,2568,685],{"class":57},[47,2570,183],{"class":53},[47,2572,2573],{"class":57},"();",[47,2575,2576],{"class":1074}," \u002F\u002F 抛出 std::future_error\n",[105,2578,2580,2581],{"id":2579},"_14-stdpackaged_task","14. ",[13,2582,2583],{},"std::packaged_task",[10,2585,2586,2588],{},[13,2587,2583],{}," 用來把一個可調用對象包裝成：",[95,2590,2591],{},[10,2592,2593],{},"執行後自動把返回值或異常寫進共享狀態的任務。",[10,2595,128],{},[38,2597,2599],{"className":40,"code":2598,"language":42,"meta":43,"style":43},"#include \u003Cfuture>\n#include \u003Ciostream>\n\nint add(int a, int b)\n{\n    return a + b;\n}\n\nint main()\n{\n    std::packaged_task\u003Cint(int, int)> task(add);\n    std::future\u003Cint> result = task.get_future();\n\n    task(10, 20);\n\n    std::cout \u003C\u003C result.get() \u003C\u003C '\\n';\n}\n",[13,2600,2601,2607,2613,2617,2638,2642,2652,2656,2660,2668,2672,2701,2720,2724,2741,2745,2769],{"__ignoreMap":43},[47,2602,2603,2605],{"class":49,"line":50},[47,2604,231],{"class":143},[47,2606,235],{"class":234},[47,2608,2609,2611],{"class":49,"line":61},[47,2610,231],{"class":143},[47,2612,242],{"class":234},[47,2614,2615],{"class":49,"line":69},[47,2616,248],{"emptyLinePlaceholder":247},[47,2618,2619,2621,2624,2626,2628,2630,2632,2634,2636],{"class":49,"line":77},[47,2620,150],{"class":143},[47,2622,2623],{"class":53}," add",[47,2625,258],{"class":57},[47,2627,150],{"class":143},[47,2629,264],{"class":263},[47,2631,267],{"class":57},[47,2633,150],{"class":143},[47,2635,272],{"class":263},[47,2637,275],{"class":57},[47,2639,2640],{"class":49,"line":85},[47,2641,280],{"class":57},[47,2643,2644,2646,2648,2650],{"class":49,"line":283},[47,2645,286],{"class":143},[47,2647,289],{"class":57},[47,2649,292],{"class":143},[47,2651,295],{"class":57},[47,2653,2654],{"class":49,"line":298},[47,2655,301],{"class":57},[47,2657,2658],{"class":49,"line":304},[47,2659,248],{"emptyLinePlaceholder":247},[47,2661,2662,2664,2666],{"class":49,"line":309},[47,2663,150],{"class":143},[47,2665,314],{"class":53},[47,2667,186],{"class":57},[47,2669,2670],{"class":49,"line":319},[47,2671,280],{"class":57},[47,2673,2674,2676,2679,2682,2684,2686,2688,2690,2693,2696,2698],{"class":49,"line":324},[47,2675,327],{"class":53},[47,2677,2678],{"class":57},"::packaged_task",[47,2680,2681],{"class":143},"\u003Cint",[47,2683,258],{"class":57},[47,2685,150],{"class":143},[47,2687,267],{"class":57},[47,2689,150],{"class":143},[47,2691,2692],{"class":57},")",[47,2694,2695],{"class":143},">",[47,2697,737],{"class":53},[47,2699,2700],{"class":57},"(add);\n",[47,2702,2703,2705,2707,2709,2711,2713,2716,2718],{"class":49,"line":353},[47,2704,327],{"class":53},[47,2706,140],{"class":57},[47,2708,332],{"class":143},[47,2710,335],{"class":57},[47,2712,338],{"class":143},[47,2714,2715],{"class":57}," task.",[47,2717,1783],{"class":53},[47,2719,1069],{"class":57},[47,2721,2722],{"class":49,"line":367},[47,2723,248],{"emptyLinePlaceholder":247},[47,2725,2726,2729,2731,2734,2736,2739],{"class":49,"line":373},[47,2727,2728],{"class":53},"    task",[47,2730,258],{"class":57},[47,2732,2733],{"class":376},"10",[47,2735,267],{"class":57},[47,2737,2738],{"class":376},"20",[47,2740,389],{"class":57},[47,2742,2743],{"class":49,"line":383},[47,2744,248],{"emptyLinePlaceholder":247},[47,2746,2747,2749,2751,2753,2755,2757,2759,2761,2763,2765,2767],{"class":49,"line":392},[47,2748,327],{"class":53},[47,2750,402],{"class":57},[47,2752,405],{"class":143},[47,2754,429],{"class":57},[47,2756,183],{"class":53},[47,2758,434],{"class":57},[47,2760,405],{"class":143},[47,2762,439],{"class":234},[47,2764,411],{"class":376},[47,2766,444],{"class":234},[47,2768,417],{"class":57},[47,2770,2771],{"class":49,"line":397},[47,2772,301],{"class":57},[10,2774,454],{},[38,2776,2778],{"className":40,"code":2777,"language":42,"meta":43,"style":43},"std::packaged_task\u003Cint(int, int)>\n",[13,2779,2780],{"__ignoreMap":43},[47,2781,2782,2784,2786,2788,2790,2792,2794,2796,2798],{"class":49,"line":50},[47,2783,54],{"class":53},[47,2785,2678],{"class":57},[47,2787,2681],{"class":143},[47,2789,258],{"class":57},[47,2791,150],{"class":143},[47,2793,267],{"class":57},[47,2795,150],{"class":143},[47,2797,2692],{"class":57},[47,2799,2800],{"class":143},">\n",[10,2802,2803],{},"表示：",[38,2805,2808],{"className":2806,"code":2807,"language":123,"meta":43},[121],"接收两个 int\n返回一个 int\n",[13,2809,2807],{"__ignoreMap":43},[105,2811,2813,2814,2817],{"id":2812},"_15-packaged_task-和-thread-配合","15. ",[13,2815,2816],{},"packaged_task"," 和 thread 配合",[38,2819,2821],{"className":40,"code":2820,"language":42,"meta":43,"style":43},"#include \u003Cfuture>\n#include \u003Ciostream>\n#include \u003Cthread>\n\nint calculate()\n{\n    return 42;\n}\n\nint main()\n{\n    std::packaged_task\u003Cint()> task(calculate);\n    std::future\u003Cint> result = task.get_future();\n\n    std::thread t(std::move(task));\n\n    std::cout \u003C\u003C result.get() \u003C\u003C '\\n';\n    t.join();\n}\n",[13,2822,2823,2829,2835,2841,2845,2853,2857,2865,2869,2873,2881,2885,2903,2921,2925,2944,2948,2972,2980],{"__ignoreMap":43},[47,2824,2825,2827],{"class":49,"line":50},[47,2826,231],{"class":143},[47,2828,235],{"class":234},[47,2830,2831,2833],{"class":49,"line":61},[47,2832,231],{"class":143},[47,2834,242],{"class":234},[47,2836,2837,2839],{"class":49,"line":69},[47,2838,231],{"class":143},[47,2840,726],{"class":234},[47,2842,2843],{"class":49,"line":77},[47,2844,248],{"emptyLinePlaceholder":247},[47,2846,2847,2849,2851],{"class":49,"line":85},[47,2848,150],{"class":143},[47,2850,255],{"class":53},[47,2852,186],{"class":57},[47,2854,2855],{"class":49,"line":283},[47,2856,280],{"class":57},[47,2858,2859,2861,2863],{"class":49,"line":298},[47,2860,286],{"class":143},[47,2862,792],{"class":376},[47,2864,417],{"class":57},[47,2866,2867],{"class":49,"line":304},[47,2868,301],{"class":57},[47,2870,2871],{"class":49,"line":309},[47,2872,248],{"emptyLinePlaceholder":247},[47,2874,2875,2877,2879],{"class":49,"line":319},[47,2876,150],{"class":143},[47,2878,314],{"class":53},[47,2880,186],{"class":57},[47,2882,2883],{"class":49,"line":324},[47,2884,280],{"class":57},[47,2886,2887,2889,2891,2893,2896,2898,2900],{"class":49,"line":353},[47,2888,327],{"class":53},[47,2890,2678],{"class":57},[47,2892,2681],{"class":143},[47,2894,2895],{"class":57},"()",[47,2897,2695],{"class":143},[47,2899,737],{"class":53},[47,2901,2902],{"class":57},"(calculate);\n",[47,2904,2905,2907,2909,2911,2913,2915,2917,2919],{"class":49,"line":367},[47,2906,327],{"class":53},[47,2908,140],{"class":57},[47,2910,332],{"class":143},[47,2912,335],{"class":57},[47,2914,338],{"class":143},[47,2916,2715],{"class":57},[47,2918,1783],{"class":53},[47,2920,1069],{"class":57},[47,2922,2923],{"class":49,"line":373},[47,2924,248],{"emptyLinePlaceholder":247},[47,2926,2927,2929,2931,2933,2935,2937,2939,2941],{"class":49,"line":383},[47,2928,327],{"class":53},[47,2930,1928],{"class":57},[47,2932,1931],{"class":53},[47,2934,258],{"class":57},[47,2936,54],{"class":53},[47,2938,344],{"class":57},[47,2940,1941],{"class":53},[47,2942,2943],{"class":57},"(task));\n",[47,2945,2946],{"class":49,"line":392},[47,2947,248],{"emptyLinePlaceholder":247},[47,2949,2950,2952,2954,2956,2958,2960,2962,2964,2966,2968,2970],{"class":49,"line":397},[47,2951,327],{"class":53},[47,2953,402],{"class":57},[47,2955,405],{"class":143},[47,2957,429],{"class":57},[47,2959,183],{"class":53},[47,2961,434],{"class":57},[47,2963,405],{"class":143},[47,2965,439],{"class":234},[47,2967,411],{"class":376},[47,2969,444],{"class":234},[47,2971,417],{"class":57},[47,2973,2974,2976,2978],{"class":49,"line":420},[47,2975,1978],{"class":57},[47,2977,1981],{"class":53},[47,2979,1069],{"class":57},[47,2981,2982],{"class":49,"line":449},[47,2983,301],{"class":57},[10,2985,2986,2988],{},[13,2987,2816],{}," 本身是 move-only 的，因此傳入線程時需要：",[38,2990,2992],{"className":40,"code":2991,"language":42,"meta":43,"style":43},"std::move(task)\n",[13,2993,2994],{"__ignoreMap":43},[47,2995,2996,2998,3000,3002],{"class":49,"line":50},[47,2997,54],{"class":53},[47,2999,344],{"class":57},[47,3001,1941],{"class":53},[47,3003,3004],{"class":57},"(task)\n",[10,3006,3007],{},"線程池內部經常會出現類似思想：",[38,3009,3012],{"className":3010,"code":3011,"language":123,"meta":43},[121],"把任务包装起来\n      ↓\n放入任务队列\n      ↓\nworker thread 取出并执行\n      ↓\nfuture 接收结果\n",[13,3013,3011],{"__ignoreMap":43},[105,3015,3017,3018,589,3020,3022],{"id":3016},"_16-promise-和-packaged_task-的區別","16. ",[13,3019,1834],{},[13,3021,2816],{}," 的區別",[10,3024,3025,3027],{},[13,3026,1834],{}," 更像：",[95,3029,3030],{},[10,3031,3032],{},"我自己決定什麼時候、在什麼邏輯裏把結果寫進去。",[10,3034,3035,3036,3027],{},"而 ",[13,3037,2816],{},[95,3039,3040],{},[10,3041,3042],{},"我已經有一個可調用對象，執行它時自動把返回值寫進 future。",[10,3044,128],{},[38,3046,3049],{"className":3047,"code":3048,"language":123,"meta":43},[121],"promise\n适合手动生产结果\n\npackaged_task\n适合包装已有函数\u002F任务\n",[13,3050,3048],{"__ignoreMap":43},[105,3052,3054,3055],{"id":3053},"_17-stdshared_future","17. ",[13,3056,3057],{},"std::shared_future",[10,3059,999,3060,3062],{},[13,3061,1002],{}," 更偏單消費者：",[38,3064,3065],{"className":40,"code":2134,"language":42,"meta":43,"style":43},[13,3066,3067],{"__ignoreMap":43},[47,3068,3069,3071,3073],{"class":49,"line":50},[47,3070,685],{"class":57},[47,3072,183],{"class":53},[47,3074,186],{"class":57},[10,3076,3077],{},"通常只能消費一次。",[10,3079,3080],{},"如果多個地方都需要讀取同一個異步結果，可以使用：",[38,3082,3084],{"className":40,"code":3083,"language":42,"meta":43,"style":43},"std::shared_future\u003CT>\n",[13,3085,3086],{"__ignoreMap":43},[47,3087,3088,3090,3093,3095,3098],{"class":49,"line":50},[47,3089,54],{"class":53},[47,3091,3092],{"class":57},"::shared_future",[47,3094,1837],{"class":143},[47,3096,3097],{"class":57},"T",[47,3099,2800],{"class":143},[10,3101,3102],{},"可以由普通 future 轉換：",[38,3104,3106],{"className":40,"code":3105,"language":42,"meta":43,"style":43},"auto future = std::async(std::launch::async, [] {\n    return 42;\n});\n\nstd::shared_future\u003Cint> shared = future.share();\n",[13,3107,3108,3132,3140,3144,3148],{"__ignoreMap":43},[47,3109,3110,3112,3114,3116,3118,3120,3122,3124,3126,3128,3130],{"class":49,"line":50},[47,3111,945],{"class":143},[47,3113,1908],{"class":57},[47,3115,338],{"class":143},[47,3117,341],{"class":53},[47,3119,344],{"class":57},[47,3121,347],{"class":53},[47,3123,258],{"class":57},[47,3125,54],{"class":53},[47,3127,344],{"class":57},[47,3129,361],{"class":53},[47,3131,1036],{"class":57},[47,3133,3134,3136,3138],{"class":49,"line":61},[47,3135,286],{"class":143},[47,3137,792],{"class":376},[47,3139,417],{"class":57},[47,3141,3142],{"class":49,"line":69},[47,3143,1049],{"class":57},[47,3145,3146],{"class":49,"line":77},[47,3147,248],{"emptyLinePlaceholder":247},[47,3149,3150,3152,3154,3156,3159,3161,3163,3166],{"class":49,"line":85},[47,3151,54],{"class":53},[47,3153,3092],{"class":57},[47,3155,332],{"class":143},[47,3157,3158],{"class":57}," shared ",[47,3160,338],{"class":143},[47,3162,1959],{"class":57},[47,3164,3165],{"class":53},"share",[47,3167,1069],{"class":57},[10,3169,3170],{},"之後多個線程可以：",[38,3172,3174],{"className":40,"code":3173,"language":42,"meta":43,"style":43},"shared.get()\n",[13,3175,3176],{"__ignoreMap":43},[47,3177,3178,3181,3183],{"class":49,"line":50},[47,3179,3180],{"class":57},"shared.",[47,3182,183],{"class":53},[47,3184,186],{"class":57},[10,3186,3187],{},"讀取同一個結果。",[105,3189,3191,3192,589,3194,3196],{"id":3190},"_18-async-和-thread-怎麼選","18. ",[13,3193,347],{},[13,3195,524],{}," 怎麼選",[10,3198,3199],{},"如果你關心的是：",[38,3201,3204],{"className":3202,"code":3203,"language":123,"meta":43},[121],"启动一个长期运行线程\n控制线程生命周期\n线程循环\n明确 join\u002Fdetach\n",[13,3205,3203],{"__ignoreMap":43},[10,3207,3208],{},"使用：",[38,3210,3212],{"className":40,"code":3211,"language":42,"meta":43,"style":43},"std::thread \u002F std::jthread\n",[13,3213,3214],{"__ignoreMap":43},[47,3215,3216,3218,3220,3223,3225],{"class":49,"line":50},[47,3217,54],{"class":53},[47,3219,1928],{"class":57},[47,3221,3222],{"class":143},"\u002F",[47,3224,341],{"class":53},[47,3226,3227],{"class":57},"::jthread\n",[10,3229,3199],{},[38,3231,3234],{"className":3232,"code":3233,"language":123,"meta":43},[121],"提交一个任务\n未来得到返回值\n自动传播异常\n",[13,3235,3233],{"__ignoreMap":43},[10,3237,3238],{},"可以優先考慮：",[38,3240,3242],{"className":40,"code":3241,"language":42,"meta":43,"style":43},"std::async \u002F std::future\n",[13,3243,3244],{"__ignoreMap":43},[47,3245,3246,3248,3251,3253,3255],{"class":49,"line":50},[47,3247,54],{"class":53},[47,3249,3250],{"class":57},"::async ",[47,3252,3222],{"class":143},[47,3254,341],{"class":53},[47,3256,58],{"class":57},[10,3258,3259],{},"它們表達的是不同層次的抽象。",[105,3261,3263],{"id":3262},"_19-常見錯誤","19. 常見錯誤",[3265,3266,3267,3273,3281,3287,3300,3309],"ol",{},[21,3268,3269,3270,3272],{},"不寫 launch policy，卻默認認爲 ",[13,3271,221],{}," 一定創建新線程。",[21,3274,3275,3276,3278,3279,151],{},"對同一個普通 ",[13,3277,102],{}," 重複調用 ",[13,3280,927],{},[21,3282,3283,3284,3286],{},"忘記處理異步任務在 ",[13,3285,927],{}," 時重新拋出的異常。",[21,3288,3289,3291,3292,3295,3296,3299],{},[13,3290,1834],{}," 銷燬前既不 ",[13,3293,3294],{},"set_value()"," 也不 ",[13,3297,3298],{},"set_exception()","，產生 broken promise。",[21,3301,3302,3303,3305,3306,3308],{},"把 move-only 的 ",[13,3304,1834],{}," \u002F ",[13,3307,2816],{}," 當成可複製對象使用。",[21,3310,3311,3312,151],{},"爲一個長期運行、需要明確停止控制的後臺線程強行使用 ",[13,3313,221],{},[105,3315,3316],{"id":3316},"小結",[18,3318,3319,3327,3332,3337,3342,3347,3352,3357],{},[21,3320,3321,3323,3324,3326],{},[13,3322,111],{}," 表示未來產生的 ",[13,3325,3097],{}," 結果。",[21,3328,3329,3331],{},[13,3330,221],{}," 適合直接提交一個會返回結果的任務。",[21,3333,3334,3335,151],{},"明確要求真正異步執行時，使用 ",[13,3336,588],{},[21,3338,3339,3341],{},[13,3340,995],{}," 會等待結果並取得值，也會重新拋出異步任務中的異常。",[21,3343,3344,3346],{},[13,3345,1993],{}," 是結果通道的主動寫入端。",[21,3348,3349,3351],{},[13,3350,2583],{}," 把可調用對象包裝成能產生 future 的任務。",[21,3353,3354,3356],{},[13,3355,3057],{}," 允許多個消費者讀取同一個結果。",[21,3358,3359,3361,3362,3365],{},[13,3360,524],{}," 偏線程生命週期管理，",[13,3363,3364],{},"future\u002Fasync"," 偏任務與結果管理。",[3367,3368,3369],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":43,"searchDepth":61,"depth":61,"links":3371},[3372,3374,3376,3378,3385,3386,3388,3390,3392,3393,3395,3397,3399,3400,3402,3404,3406,3408,3410,3411],{"id":107,"depth":61,"text":3373},"1. std::future\u003CT> 是什麼",{"id":217,"depth":61,"text":3375},"2. 最簡單的 std::async",{"id":517,"depth":61,"text":3377},"3. async 的參數和 thread 很像",{"id":584,"depth":61,"text":3379,"children":3380},"4. std::launch::async 和 std::launch::deferred",[3381,3383],{"id":601,"depth":69,"text":3382},"4.1 std::launch::async",{"id":642,"depth":69,"text":3384},"4.2 std::launch::deferred",{"id":931,"depth":61,"text":932},{"id":991,"depth":61,"text":3387},"6. future::get() 只能取得一次",{"id":1106,"depth":61,"text":3389},"7. wait()：只等待，不取結果",{"id":1202,"depth":61,"text":3391},"8. wait_for()：等待一段時間",{"id":1518,"depth":61,"text":1519},{"id":1749,"depth":61,"text":3394},"10. std::promise\u003CT>",{"id":2016,"depth":61,"text":3396},"11. promise::set_value()",{"id":2063,"depth":61,"text":3398},"12. promise::set_exception()",{"id":2465,"depth":61,"text":2466},{"id":2579,"depth":61,"text":3401},"14. std::packaged_task",{"id":2812,"depth":61,"text":3403},"15. packaged_task 和 thread 配合",{"id":3016,"depth":61,"text":3405},"16. promise 和 packaged_task 的區別",{"id":3053,"depth":61,"text":3407},"17. std::shared_future",{"id":3190,"depth":61,"text":3409},"18. async 和 thread 怎麼選",{"id":3262,"depth":61,"text":3263},{"id":3316,"depth":61,"text":3316},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0500-future-async-promise","2000-1900-0500","2023-10-05","std::thread 很適合表達“啓動一個線程”，但它本身不直接提供：","wiki\u002F2023-10-05-cplusplus-jiao-xue","zh-hant:2023-10-05-cplusplus-jiao-xue","\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue","Cplusplus教学","md","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0500-future-async-promise",false,null,"zh-Hant","zh-hant",{},{"title":5,"description":3415},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0500-future-async-promise","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0500-future-async-promise","IVPGAA1w5UjVM9-9QKId9t6_eaFmQvSq7CyQB-T308k",[3432,3438,3443,3448,3453,3458,3463,3468,3473,3478,3483,3488,3493,3498,3503,3508,3513,3518,3523,3528,3533,3538,3543,3548,3553,3558,3563,3568,3573,3578,3583,3588,3593,3598,3603,3608,3613,3618,3623,3628,3632,3637,3641,3646,3651,3656,3661,3666,3671,3676,3681,3686,3691,3696,3701,3706,3711,3716,3720,3725,3730,3735,3736,3741,3746,3751,3756,3761,3766,3771,3776,3781,3786,3791,3796,3801,3806,3811,3816,3821,3826,3831,3836,3841,3846,3851,3856],{"path":3433,"stem":3434,"title":3435,"date":3414,"chapterOrder":3436,"chapterDepth":3437,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0100-c-kai-fa-huan-jing-da-jian-yu-ce-shi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0100-C++开发环境搭建与测试","C++開發環境搭建與測試","0100",0,{"path":3439,"stem":3440,"title":3441,"date":3414,"chapterOrder":3442,"chapterDepth":3437,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0200-c-ji-chu-chu-shi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0200-C++基础初识","C++基礎初識","0200",{"path":3444,"stem":3445,"title":3446,"date":3414,"chapterOrder":3447,"chapterDepth":3437,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0300-shu-ju-lei-xing-yu-shu-ju-cun-fang","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0300-数据类型与数据存放","數據類型與數據存放","0300",{"path":3449,"stem":3450,"title":3451,"date":3414,"chapterOrder":3452,"chapterDepth":3437,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0400-shu-ru-shu-chu","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0400-输入输出","輸入輸出","0400",{"path":3454,"stem":3455,"title":3456,"date":3414,"chapterOrder":3457,"chapterDepth":3437,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0500-yun-suan-fu","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0500-运算符","運算符","0500",{"path":3459,"stem":3460,"title":3461,"date":3414,"chapterOrder":3462,"chapterDepth":3437,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0600-cheng-xu-liu-cheng-jie-gou","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0600-程序流程结构","程序流程結構","0600",{"path":3464,"stem":3465,"title":3466,"date":3414,"chapterOrder":3467,"chapterDepth":3437,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0700-shu-zu","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0700-数组","數組","0700",{"path":3469,"stem":3470,"title":3471,"date":3414,"chapterOrder":3472,"chapterDepth":3437,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0800-han-shu-yu-tou-wen-jian","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0800-函数与头文件","函數與頭文件","0800",{"path":3474,"stem":3475,"title":3476,"date":3414,"chapterOrder":3477,"chapterDepth":3437,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0900-zhi-zhen","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0900-指针","指針","0900",{"path":3479,"stem":3480,"title":3481,"date":3414,"chapterOrder":3482,"chapterDepth":3437,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1000-jie-gou-ti-yu-gong-yong-ti","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1000-结构体与共用体","結構體與共用體","1000",{"path":3484,"stem":3485,"title":3486,"date":3414,"chapterOrder":3487,"chapterDepth":3437,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1100-nei-cun-fen-qu-yu-sheng-ming-zhou-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1100-内存分区与生命周期","內存分區與生命週期","1100",{"path":3489,"stem":3490,"title":3491,"date":3414,"chapterOrder":3492,"chapterDepth":3437,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1200-yin-yong","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1200-引用","引用","1200",{"path":3494,"stem":3495,"title":3496,"date":3414,"chapterOrder":3497,"chapterDepth":3437,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1300-han-shu-ti-gao","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1300-函数提高","函數提高","1300",{"path":3499,"stem":3500,"title":3501,"date":3414,"chapterOrder":3502,"chapterDepth":3437,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1350-ming-ming-kong-jian","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1350-命名空间","命名空間","1350",{"path":3504,"stem":3505,"title":3506,"date":3414,"chapterOrder":3507,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0100-feng-zhuang","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0100-封装","封裝","1400-0100",{"path":3509,"stem":3510,"title":3511,"date":3414,"chapterOrder":3512,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0200-dui-xiang-chu-shi-hua-he-qing-li","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0200-对象初始化和清理","對象初始化和清理","1400-0200",{"path":3514,"stem":3515,"title":3516,"date":3414,"chapterOrder":3517,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0300-dui-xiang-mo-xing-yu-this-zhi-zhen","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0300-对象模型与this指针","對象模型與this指針","1400-0300",{"path":3519,"stem":3520,"title":3521,"date":3414,"chapterOrder":3522,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0400-you-yuan-yu-yun-suan-fu-zhong-zai","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0400-友元与运算符重载","友元與運算符重載","1400-0400",{"path":3524,"stem":3525,"title":3526,"date":3414,"chapterOrder":3527,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0500-ji-cheng","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0500-继承","繼承","1400-0500",{"path":3529,"stem":3530,"title":3531,"date":3414,"chapterOrder":3532,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0600-duo-tai","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0600-多态","多態","1400-0600",{"path":3534,"stem":3535,"title":3536,"date":3414,"chapterOrder":3537,"chapterDepth":3437,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-lei-he-dui-xiang","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-类和对象","類和對象","1400",{"path":3539,"stem":3540,"title":3541,"date":3414,"chapterOrder":3542,"chapterDepth":3437,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1450-han-shu-zhi-zhen","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1450-函数指针","函數指針","1450",{"path":3544,"stem":3545,"title":3546,"date":3414,"chapterOrder":3547,"chapterDepth":3437,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1500-wen-jian-cao-zuo","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1500-文件操作","文件操作","1500",{"path":3549,"stem":3550,"title":3551,"date":3414,"chapterOrder":3552,"chapterDepth":3437,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1600-yi-chang-chu-li-yu-cuo-wu-ma","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1600-异常处理与错误码","異常處理","1600",{"path":3554,"stem":3555,"title":3556,"date":3414,"chapterOrder":3557,"chapterDepth":3437,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1700-mu-ban","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1700-模板","模板","1700",{"path":3559,"stem":3560,"title":3561,"date":3414,"chapterOrder":3562,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0100-stl-chu-shi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0100-STL初识","STL初識","1800-0100",{"path":3564,"stem":3565,"title":3566,"date":3414,"chapterOrder":3567,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0200-std-array","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0200-std-array","std::array","1800-0200",{"path":3569,"stem":3570,"title":3571,"date":3414,"chapterOrder":3572,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0300-string-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0300-string容器","string容器","1800-0300",{"path":3574,"stem":3575,"title":3576,"date":3414,"chapterOrder":3577,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0400-vector-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0400-vector容器","vector 容器","1800-0400",{"path":3579,"stem":3580,"title":3581,"date":3414,"chapterOrder":3582,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0500-deque-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0500-deque容器","deque 容器","1800-0500",{"path":3584,"stem":3585,"title":3586,"date":3414,"chapterOrder":3587,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0600-stack-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0600-stack容器","stack 容器","1800-0600",{"path":3589,"stem":3590,"title":3591,"date":3414,"chapterOrder":3592,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0700-queue-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0700-queue容器","queue 容器","1800-0700",{"path":3594,"stem":3595,"title":3596,"date":3414,"chapterOrder":3597,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0800-list-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0800-list容器","list 容器","1800-0800",{"path":3599,"stem":3600,"title":3601,"date":3414,"chapterOrder":3602,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0900-set-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0900-set容器","set \u002F multiset 容器","1800-0900",{"path":3604,"stem":3605,"title":3606,"date":3414,"chapterOrder":3607,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1000-map-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1000-map容器","map \u002F multimap 容器","1800-1000",{"path":3609,"stem":3610,"title":3611,"date":3414,"chapterOrder":3612,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1100-han-shu-dui-xiang-yu-wei-ci","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1100-函数对象与谓词","函數對象與謂詞","1800-1100",{"path":3614,"stem":3615,"title":3616,"date":3414,"chapterOrder":3617,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1200-chang-yong-suan-fa","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1200-常用算法","常用算法","1800-1200",{"path":3619,"stem":3620,"title":3621,"date":3414,"chapterOrder":3622,"chapterDepth":3437,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-stl-ti-gao-bian-cheng","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-STL提高编程","STL提高編程","1800",{"path":3624,"stem":3625,"title":3626,"date":3414,"chapterOrder":3627,"chapterDepth":3437,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1900-c-lei-xing-zhuan-huan","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1900-C++类型转换","C++類型轉換","1900",{"path":3629,"stem":3630,"title":945,"date":3414,"chapterOrder":3631,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0100-auto","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0100-auto","2000-0100",{"path":3633,"stem":3634,"title":3635,"date":3414,"chapterOrder":3636,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0200-nullptr","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0200-nullptr","nullptr","2000-0200",{"path":3638,"stem":3639,"title":1331,"date":3414,"chapterOrder":3640,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0300-using","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0300-using","2000-0300",{"path":3642,"stem":3643,"title":3644,"date":3414,"chapterOrder":3645,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0400-enum-class","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0400-enum-class","enum class","2000-0400",{"path":3647,"stem":3648,"title":3649,"date":3414,"chapterOrder":3650,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0500-fan-wei-for-xun-huan","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0500-范围for循环","範圍 for 循環","2000-0500",{"path":3652,"stem":3653,"title":3654,"date":3414,"chapterOrder":3655,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0600-jie-gou-hua-bang-ding","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0600-结构化绑定","結構化綁定","2000-0600",{"path":3657,"stem":3658,"title":3659,"date":3414,"chapterOrder":3660,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0700-constexpr","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0700-constexpr","constexpr","2000-0700",{"path":3662,"stem":3663,"title":3664,"date":3414,"chapterOrder":3665,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0800-RAII","RAII","2000-0800",{"path":3667,"stem":3668,"title":3669,"date":3414,"chapterOrder":3670,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0900-智能指针","智能指針","2000-0900",{"path":3672,"stem":3673,"title":3674,"date":3414,"chapterOrder":3675,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1000-右值引用和移动语义","右值引用和移動語義","2000-1000",{"path":3677,"stem":3678,"title":3679,"date":3414,"chapterOrder":3680,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1100-lambda-biao-da-shi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1100-Lambda表达式","Lambda 表達式","2000-1100",{"path":3682,"stem":3683,"title":3684,"date":3414,"chapterOrder":3685,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1200-std-function","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1200-std-function","std::function","2000-1200",{"path":3687,"stem":3688,"title":3689,"date":3414,"chapterOrder":3690,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1300-std-bind","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1300-std-bind","std::bind","2000-1300",{"path":3692,"stem":3693,"title":3694,"date":3414,"chapterOrder":3695,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1400-std-optional","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1400-std-optional","std::optional","2000-1400",{"path":3697,"stem":3698,"title":3699,"date":3414,"chapterOrder":3700,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1500-std-variant","std::variant","2000-1500",{"path":3702,"stem":3703,"title":3704,"date":3414,"chapterOrder":3705,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1600-std-span","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1600-std-span","std::span","2000-1600",{"path":3707,"stem":3708,"title":3709,"date":3414,"chapterOrder":3710,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1700-std-format-print","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1700-std-format-print","std::format \u002F std::print","2000-1700",{"path":3712,"stem":3713,"title":3714,"date":3414,"chapterOrder":3715,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1800-std-chrono","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1800-std-chrono","std::chrono","2000-1800",{"path":3717,"stem":3718,"title":15,"date":3414,"chapterOrder":3719,"chapterDepth":61,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0100-std-thread","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0100-std-thread","2000-1900-0100",{"path":3721,"stem":3722,"title":3723,"date":3414,"chapterOrder":3724,"chapterDepth":61,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0200-mutex-lock-guard","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0200-mutex-lock-guard","mutex 與 RAII 鎖","2000-1900-0200",{"path":3726,"stem":3727,"title":3728,"date":3414,"chapterOrder":3729,"chapterDepth":61,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0300-std-atomic","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0300-std-atomic","std::atomic","2000-1900-0300",{"path":3731,"stem":3732,"title":3733,"date":3414,"chapterOrder":3734,"chapterDepth":61,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0400-condition-variable","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0400-condition-variable","condition_variable","2000-1900-0400",{"path":3412,"stem":3429,"title":5,"date":3414,"chapterOrder":3413,"chapterDepth":61,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},{"path":3737,"stem":3738,"title":3739,"date":3414,"chapterOrder":3740,"chapterDepth":61,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0600-jthread-stop-token","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0600-jthread-stop-token","jthread 與 stop_token","2000-1900-0600",{"path":3742,"stem":3743,"title":3744,"date":3414,"chapterOrder":3745,"chapterDepth":61,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0700-semaphore-latch-barrier","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0700-semaphore-latch-barrier","semaphore、latch 與 barrier","2000-1900-0700",{"path":3747,"stem":3748,"title":3749,"date":3414,"chapterOrder":3750,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-bing-fa-bian-cheng","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-并发编程","併發編程","2000-1900",{"path":3752,"stem":3753,"title":3754,"date":3414,"chapterOrder":3755,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2000-std-filesystem","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-2000-std-filesystem","std::filesystem","2000-2000",{"path":3757,"stem":3758,"title":3759,"date":3414,"chapterOrder":3760,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2100-modules-jian-jie","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-2100-modules简介","modules 簡介","2000-2100",{"path":3762,"stem":3763,"title":3764,"date":3414,"chapterOrder":3765,"chapterDepth":3437,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-xian-dai-c","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-现代C++","現代C++","2000",{"path":3767,"stem":3768,"title":3769,"date":3414,"chapterOrder":3770,"chapterDepth":61,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0100-定时器与异步IO","定時器與異步 IO","2100-0100-0100",{"path":3772,"stem":3773,"title":3774,"date":3414,"chapterOrder":3775,"chapterDepth":61,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0200-Boost.Asio基础","Boost.Asio 基礎","2100-0100-0200",{"path":3777,"stem":3778,"title":3779,"date":3414,"chapterOrder":3780,"chapterDepth":61,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0300-chuan-kou-tong-xin","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0300-串口通信","串口通信","2100-0100-0300",{"path":3782,"stem":3783,"title":3784,"date":3414,"chapterOrder":3785,"chapterDepth":61,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0400-TCP通信","TCP 通信","2100-0100-0400",{"path":3787,"stem":3788,"title":3789,"date":3414,"chapterOrder":3790,"chapterDepth":61,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0500-udp-tong-xin","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0500-UDP通信","UDP 通信","2100-0100-0500",{"path":3792,"stem":3793,"title":3794,"date":3414,"chapterOrder":3795,"chapterDepth":61,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0600-ji-qi-ren-gong-cheng-xie-fa-yu-ros2-ji-cheng","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0600-机器人工程写法与ROS2集成","機器人工程寫法與 ROS2 集成","2100-0100-0600",{"path":3797,"stem":3798,"title":3799,"date":3414,"chapterOrder":3800,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-boost-asio-yi-bu-io-ku","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-Boost.Asio异步IO库","Boost.Asio異步IO庫","2100-0100",{"path":3802,"stem":3803,"title":3804,"date":3414,"chapterOrder":3805,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0200-eigen-xian-xing-dai-shu-ku","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0200-Eigen线性代数库","Eigen線性代數庫","2100-0200",{"path":3807,"stem":3808,"title":3809,"date":3414,"chapterOrder":3810,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0300-opencv-ji-suan-ji-shi-jue-ku","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0300-OpenCV计算机视觉库","OpenCV計算機視覺庫","2100-0300",{"path":3812,"stem":3813,"title":3814,"date":3414,"chapterOrder":3815,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0400-pcl-dian-yun-ku","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0400-PCL点云库","PCL點雲庫","2100-0400",{"path":3817,"stem":3818,"title":3819,"date":3414,"chapterOrder":3820,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0500-sophus-li-qun-li-dai-shu-ku","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0500-Sophus李群李代数库","Sophus 李羣李代數庫","2100-0500",{"path":3822,"stem":3823,"title":3824,"date":3414,"chapterOrder":3825,"chapterDepth":3437,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-chang-yong-ku","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-常用库","常用庫學習","2100",{"path":3827,"stem":3828,"title":3829,"date":3414,"chapterOrder":3830,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0100-cmakepresets-yu-gou-jian-an-zhuang","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0100-CMakePresets与构建安装","CMakePresets與構建安裝","2200-0100",{"path":3832,"stem":3833,"title":3834,"date":3414,"chapterOrder":3835,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0200-ding-ceng-cmake-yu-gong-gong-bian-yi-xuan-xiang","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0200-顶层CMake与公共编译选项","頂層CMake與公共編譯選項","2200-0200",{"path":3837,"stem":3838,"title":3839,"date":3414,"chapterOrder":3840,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0300-src与lib模块CMake详解","src與lib模塊CMake詳解","2200-0300",{"path":3842,"stem":3843,"title":3844,"date":3414,"chapterOrder":3845,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0400-di-san-fang-ku-yi-lai-xie-fa","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0400-第三方库依赖写法","第三方庫依賴寫法","2200-0400",{"path":3847,"stem":3848,"title":3849,"date":3414,"chapterOrder":3850,"chapterDepth":50,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0500-mu-ban-kuo-zhan-yu-chang-jian-wen-ti","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0500-模板扩展与常见问题","模板擴展與常見問題","2200-0500",{"path":3852,"stem":3853,"title":3854,"date":3414,"chapterOrder":3855,"chapterDepth":3437,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":3422},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-cmake-gong-cheng-mu-ban","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-CMake工程模板","CMake工程模板","2200",{"path":3418,"stem":3857,"title":3858,"date":3414,"chapterOrder":3423,"chapterDepth":3437,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":247,"isWikiIndex":247},"_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002Findex","C\u002FC++教程",{"variants":3860},[3861,3864,3865,3868,3871],{"path":3862,"localeSlug":3863,"i18nKey":3421},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0500-future-async-promise","en-us",{"path":3412,"localeSlug":3425,"i18nKey":3421},{"path":3866,"localeSlug":3867,"i18nKey":3421},"\u002Fzh-hk\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0500-future-async-promise","zh-hk",{"path":3869,"localeSlug":3870,"i18nKey":3421},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0500-future-async-promise","zh-tw",{"path":3872,"localeSlug":3873,"i18nKey":3421},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0500-future-async-promise","zh-cn",[3862,3428,3412,3428,3866,3428,3869,3428,3872,3428],1789198829349]