{"id":87030,"date":"2026-07-29T17:48:32","date_gmt":"2026-07-29T09:48:32","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/87030.html"},"modified":"2026-07-29T17:48:32","modified_gmt":"2026-07-29T09:48:32","slug":"c23-%e6%96%b0%e7%89%b9%e6%80%a7%e5%9c%a8-clion-%e4%b8%ad%e7%9a%84%e5%ae%9e%e6%88%98%e4%bd%93%e9%aa%8c%e4%b8%8e%e9%80%82%e9%85%8d%e8%af%84%e6%b5%8b","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/87030.html","title":{"rendered":"C++23 \u65b0\u7279\u6027\u5728 CLion \u4e2d\u7684\u5b9e\u6218\u4f53\u9a8c\u4e0e\u9002\u914d\u8bc4\u6d4b"},"content":{"rendered":"<hr \/>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/07\/20260729094828-6a69cc6ce6c02.jpg\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<hr \/>\n<h4>C&#043;&#043;23 \u65b0\u7279\u6027\u5728 CLion \u4e2d\u7684\u5b9e\u6218\u4f53\u9a8c\u4e0e\u9002\u914d\u8bc4\u6d4b<\/h4>\n<ul>\n<li>\n<ul>\n<li>\u6458\u8981<\/li>\n<li>\u76ee\u5f55<\/li>\n<li>\u4e00\u3001std::expected \u9519\u8bef\u5904\u7406\u673a\u5236\u7684\u4ee3\u7801\u7ea7\u6f14\u793a<\/li>\n<li>\n<ul>\n<li>1.1 \u9707\u64bc\u5bf9\u6bd4&#xff1a;30\u884c\u9519\u8bef\u7801 vs 8\u884c\u94fe\u5f0f\u8c03\u7528<\/li>\n<li>1.2 Monadic\u7ba1\u9053\u7684\u89c6\u89c9\u51b2\u51fb\u529b<\/li>\n<li>\n<ul>\n<li>1.2.1 \u4e94\u6b65\u9a8c\u8bc1\u7ba1\u9053\u7684\u4f18\u96c5\u5b9e\u73b0<\/li>\n<li>1.2.2 \u9519\u8bef\u4fe1\u606f\u7684\u81ea\u52a8\u4f20\u64ad\u4e0e\u805a\u5408<\/li>\n<li>1.2.3 \u4e0eRust Result\u7684\u8bed\u6cd5\u5bf9\u6807<\/li>\n<\/ul>\n<\/li>\n<li>1.3 \u771f\u5b9e\u573a\u666f&#xff1a;JSON\u914d\u7f6e\u89e3\u6790\u5668\u7684\u5b8c\u6574\u6f14\u793a<\/li>\n<li>\n<ul>\n<li>1.3.1 \u89e3\u6790\u5668\u7684\u7c7b\u578b\u5b89\u5168\u8bbe\u8ba1<\/li>\n<\/ul>\n<\/li>\n<li>1.4 \u6548\u679c\u4eae\u70b9\u603b\u7ed3<\/li>\n<\/ul>\n<\/li>\n<li>\u4e8c\u3001\u534f\u7a0b\u4f18\u5316\u5728 2026.1 \u7248\u672c\u4e2d\u7684\u6838\u5fc3\u652f\u6301\u89e3\u6790<\/li>\n<li>\n<ul>\n<li>2.1 std::generator\u7684\u96f6\u6837\u677f\u4ee3\u7801\u4f53\u9a8c<\/li>\n<li>2.2 \u65e0\u9650\u5e8f\u5217\u7684\u60f0\u6027\u6c42\u503c\u6f14\u793a<\/li>\n<li>\n<ul>\n<li>2.2.1 \u6590\u6ce2\u90a3\u5951\u6570\u5217&#xff1a;\u4ece\u9012\u5f52\u5230\u534f\u7a0b<\/li>\n<li>2.2.2 \u7d20\u6570\u7b5b\u7684\u6d41\u5f0f\u5b9e\u73b0<\/li>\n<li>2.2.3 \u4e0ePython\u751f\u6210\u5668\u7684\u8bed\u6cd5\u5bf9\u6bd4<\/li>\n<\/ul>\n<\/li>\n<li>2.3 \u534f\u7a0b\u4e0eRanges\u7684\u878d\u5408\u6548\u679c<\/li>\n<li>\n<ul>\n<li>2.3.1 \u7ba1\u9053\u5f0f\u6570\u636e\u53d8\u6362<\/li>\n<\/ul>\n<\/li>\n<li>2.4 \u81ea\u5b9a\u4e49\u534f\u7a0b\u7c7b\u578b\u7684IDE\u652f\u6301<\/li>\n<li>2.5 \u6548\u679c\u4eae\u70b9\u603b\u7ed3<\/li>\n<\/ul>\n<\/li>\n<li>\u4e09\u3001\u771f\u5b9e\u9879\u76ee\u573a\u666f\u4e0b\u7684\u8fc1\u79fb\u9002\u914d\u6d41\u7a0b\u590d\u76d8<\/li>\n<li>\n<ul>\n<li>3.1 \u9879\u76ee\u80cc\u666f&#xff1a;\u4e00\u4e2a10\u4e07\u884c\u7684\u7f51\u7edc\u670d\u52a1\u6846\u67b6<\/li>\n<li>3.2 \u8fc1\u79fb\u524d\u7684\u4ee3\u7801&#034;\u707e\u96be\u73b0\u573a&#034;<\/li>\n<li>3.3 \u4e09\u9636\u6bb5\u8fc1\u79fb\u7684\u5b8c\u6574\u590d\u76d8<\/li>\n<li>\n<ul>\n<li>3.3.1 \u7b2c\u4e00\u9636\u6bb5&#xff1a;\u9519\u8bef\u7c7b\u578b\u7edf\u4e00&#xff08;\u8017\u65f62\u5929&#xff09;<\/li>\n<li>3.3.2 \u7b2c\u4e8c\u9636\u6bb5&#xff1a;\u6838\u5fc3\u6a21\u5757\u91cd\u6784&#xff08;\u8017\u65f65\u5929&#xff09;<\/li>\n<li>3.3.3 \u7b2c\u4e09\u9636\u6bb5&#xff1a;\u534f\u7a0b\u5f02\u6b65\u5316&#xff08;\u8017\u65f63\u5929&#xff09;<\/li>\n<\/ul>\n<\/li>\n<li>3.4 \u8fc1\u79fb\u524d\u540e\u7684\u4ee3\u7801\u91cf\u5bf9\u6bd4<\/li>\n<li>3.5 \u6548\u679c\u4eae\u70b9\u603b\u7ed3<\/li>\n<\/ul>\n<\/li>\n<li>\u56db\u3001\u7f16\u8bd1\u671f\u8bca\u65ad\u4e0e\u8fd0\u884c\u65f6\u6027\u80fd\u5bf9\u6bd4\u5b9e\u6d4b<\/li>\n<li>\n<ul>\n<li>4.1 \u7f16\u8bd1\u671f\u8bca\u65ad\u7684\u7cbe\u51c6\u5ea6\u5c55\u793a<\/li>\n<li>\n<ul>\n<li>4.1.1 \u6a21\u677f\u9519\u8bef\u4fe1\u606f\u7684\u53ef\u8bfb\u6027\u98de\u8dc3<\/li>\n<li>4.1.2 CLion\u7684\u5b9e\u65f6\u8bca\u65ad\u901f\u5ea6<\/li>\n<\/ul>\n<\/li>\n<li>4.2 \u8fd0\u884c\u65f6\u6027\u80fd\u5b9e\u6d4b<\/li>\n<li>\n<ul>\n<li>4.2.1 \u6d4b\u8bd5\u73af\u5883\u4e0e\u65b9\u6cd5\u8bba<\/li>\n<li>4.2.2 \u6210\u529f\u8def\u5f84&#xff1a;expected vs \u5f02\u5e38 vs \u9519\u8bef\u7801<\/li>\n<li>4.2.3 \u5931\u8d25\u8def\u5f84&#xff1a;\u6570\u91cf\u7ea7\u7684\u5dee\u8ddd<\/li>\n<li>4.2.4 \u534f\u7a0b vs \u56de\u8c03 vs future<\/li>\n<\/ul>\n<\/li>\n<li>4.3 \u5185\u5b58\u5360\u7528\u5bf9\u6bd4<\/li>\n<li>4.4 \u6548\u679c\u4eae\u70b9\u603b\u7ed3<\/li>\n<\/ul>\n<\/li>\n<li>\u4e94\u3001\u667a\u80fd\u63d0\u793a\u4e0e\u91cd\u6784\u5de5\u5177\u7684\u5b9e\u9645\u8f85\u52a9\u6548\u679c<\/li>\n<li>\n<ul>\n<li>5.1 \u4ee3\u7801\u8865\u5168\u7684\u667a\u80fd\u7a0b\u5ea6<\/li>\n<li>\n<ul>\n<li>5.1.1 Monadic\u94fe\u7684\u4e0a\u4e0b\u6587\u611f\u77e5\u8865\u5168<\/li>\n<li>5.1.2 \u534f\u7a0b\u5173\u952e\u5b57\u7684\u573a\u666f\u5316\u63d0\u793a<\/li>\n<\/ul>\n<\/li>\n<li>5.2 \u91cd\u6784\u64cd\u4f5c\u7684\u6d41\u7545\u5ea6<\/li>\n<li>\n<ul>\n<li>5.2.1 \u9519\u8bef\u7801\u5230expected\u7684\u4e00\u952e\u8fc1\u79fb<\/li>\n<\/ul>\n<\/li>\n<li>5.3 \u4ee3\u7801\u68c0\u67e5\u4e0e\u5feb\u901f\u4fee\u590d<\/li>\n<li>5.4 \u6548\u679c\u4eae\u70b9\u603b\u7ed3<\/li>\n<\/ul>\n<\/li>\n<li>\u516d\u3001\u590d\u6742\u6a21\u677f\u63a8\u5bfc\u4e0e\u7c7b\u578b\u5b89\u5168\u7684\u9a8c\u8bc1\u6848\u4f8b<\/li>\n<li>\n<ul>\n<li>6.1 \u4e94\u5c42\u5d4c\u5957expected\u7684\u7c7b\u578b\u63a8\u5bfc<\/li>\n<li>6.2 Deducing this\u4e0eexpected\u7684\u7ec4\u5408<\/li>\n<li>6.3 \u7f16\u8bd1\u671f\u7c7b\u578b\u5b89\u5168\u9a8c\u8bc1<\/li>\n<li>6.4 \u6548\u679c\u4eae\u70b9\u603b\u7ed3<\/li>\n<\/ul>\n<\/li>\n<li>\u4e03\u3001\u73b0\u6709\u4ee3\u7801\u5e93\u5347\u7ea7\u7684\u517c\u5bb9\u6027\u8fb9\u754c\u6d4b\u8bd5<\/li>\n<li>\n<ul>\n<li>7.1 \u6d4b\u8bd5\u77e9\u9635\u8bbe\u8ba1<\/li>\n<li>7.2 \u4e0eC&#043;&#043;17\u4ee3\u7801\u7684\u5171\u5b58\u6d4b\u8bd5<\/li>\n<li>7.3 \u4e0e\u7b2c\u4e09\u65b9\u5e93\u7684\u517c\u5bb9\u6027<\/li>\n<li>\n<ul>\n<li>7.3.1 Boost.Outcome\u4e92\u64cd\u4f5c<\/li>\n<\/ul>\n<\/li>\n<li>7.4 \u8de8\u7f16\u8bd1\u5668\u4e00\u81f4\u6027\u9a8c\u8bc1<\/li>\n<li>7.5 \u6548\u679c\u4eae\u70b9\u603b\u7ed3<\/li>\n<\/ul>\n<\/li>\n<li>\u516b\u3001\u8c03\u8bd5\u5668\u5bf9\u5f02\u6b65\u6808\u5e27\u8ffd\u8e2a\u7684\u652f\u6301\u8868\u73b0<\/li>\n<li>\n<ul>\n<li>8.1 \u534f\u7a0b\u65ad\u70b9\u7684\u547d\u4e2d\u7cbe\u5ea6<\/li>\n<li>8.2 \u534f\u7a0b\u5e27\u53d8\u91cf\u7684\u53ef\u89c6\u5316<\/li>\n<li>8.3 \u4e0e\u4f20\u7edf\u8c03\u8bd5\u4f53\u9a8c\u7684\u5bf9\u6bd4<\/li>\n<li>8.4 \u591a\u534f\u7a0b\u5e76\u53d1\u8c03\u8bd5<\/li>\n<li>8.5 \u6548\u679c\u4eae\u70b9\u603b\u7ed3<\/li>\n<\/ul>\n<\/li>\n<li>\u4e5d\u3001\u6784\u5efa\u7cfb\u7edf\u914d\u7f6e\u4e0e\u65b0\u6807\u51c6\u96c6\u7684\u534f\u540c\u7b56\u7565<\/li>\n<li>\n<ul>\n<li>9.1 CMake\u7684C&#043;&#043;23\u914d\u7f6e\u6700\u4f73\u5b9e\u8df5<\/li>\n<li>9.2 \u591a\u6807\u51c6\u5171\u5b58\u7684\u7f16\u8bd1\u7b56\u7565<\/li>\n<li>9.3 \u7279\u6027\u68c0\u6d4b\u7684\u81ea\u52a8\u5316\u65b9\u6848<\/li>\n<li>9.4 CI\/CD\u4e2d\u7684\u591a\u7f16\u8bd1\u5668\u77e9\u9635<\/li>\n<li>9.5 \u6548\u679c\u4eae\u70b9\u603b\u7ed3<\/li>\n<\/ul>\n<\/li>\n<li>\u5341\u3001\u5f00\u53d1\u8005\u5de5\u4f5c\u6d41\u6548\u7387\u63d0\u5347\u7684\u7efc\u5408\u8bc4\u4f30<\/li>\n<li>\n<ul>\n<li>10.1 \u7f16\u7801\u6548\u7387\u91cf\u5316\u5bf9\u6bd4<\/li>\n<li>10.2 \u4ee3\u7801\u5ba1\u67e5\u6548\u7387\u63d0\u5347<\/li>\n<li>10.3 Bug\u53d1\u73b0\u7387\u7684\u53d8\u5316<\/li>\n<li>10.4 \u65b0\u4eba\u4e0a\u624b\u901f\u5ea6<\/li>\n<li>10.5 \u7efc\u5408\u8bc4\u5206\u4e0e\u63a8\u8350\u6307\u6570<\/li>\n<\/ul>\n<\/li>\n<li>\u5341\u4e00\u3001\u5e38\u89c1\u9677\u9631\u4e0e\u95ee\u9898\u6392\u9664<\/li>\n<li>\n<ul>\n<li>11.1 std::expected\u7684\u4e94\u5927\u9677\u9631<\/li>\n<li>11.2 \u534f\u7a0b\u7684\u56db\u5927\u9677\u9631<\/li>\n<li>11.3 CLion IDE\u7684\u4e09\u5927\u95ee\u9898<\/li>\n<li>11.4 \u95ee\u9898\u6392\u9664\u901f\u67e5\u8868<\/li>\n<\/ul>\n<\/li>\n<li>\u5341\u4e8c\u3001\u603b\u7ed3<\/li>\n<li>\n<ul>\n<li>12.1 \u5341\u5927\u6838\u5fc3\u53d1\u73b0<\/li>\n<li>12.2 \u6700\u7ec8\u63a8\u8350<\/li>\n<\/ul>\n<\/li>\n<li>\u5341\u4e09\u3001\u8be6\u7ec6\u53c2\u8003\u8d44\u6599<\/li>\n<li>\n<ul>\n<li>13.1 \u6807\u51c6\u63d0\u6848\u6587\u6863<\/li>\n<li>13.2 \u7f16\u8bd1\u5668\u4e0e\u5de5\u5177<\/li>\n<li>13.3 \u6df1\u5ea6\u9605\u8bfb<\/li>\n<\/ul>\n<\/li>\n<li>\u9644\u5f55<\/li>\n<li>\n<ul>\n<li>\u9644\u5f55A&#xff1a;\u5b8c\u6574\u6f14\u793a\u9879\u76ee\u6e90\u7801\u7ed3\u6784<\/li>\n<li>\u9644\u5f55B&#xff1a;\u6027\u80fd\u6d4b\u8bd5\u539f\u59cb\u6570\u636e<\/li>\n<li>\u9644\u5f55C&#xff1a;CLion 2026.1\u914d\u7f6e\u5feb\u7167<\/li>\n<li>\u9644\u5f55D&#xff1a;\u7f16\u8bd1\u5668\u652f\u6301\u77e9\u9635&#xff08;2026\u5e747\u6708&#xff09;<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<hr \/>\n<h3>\u6458\u8981<\/h3>\n<p>\u5f53C&#043;&#043;23\u6807\u51c6\u9047\u4e0aCLion 2026.1\u7684CLion Nova\u5f15\u64ce&#xff0c;\u4f1a\u78b0\u649e\u51fa\u600e\u6837\u7684\u706b\u82b1&#xff1f;\u672c\u6587\u4ee5&#034;\u6548\u679c\u5c55\u793a&#034;\u4e3a\u6838\u5fc3\u89c6\u89d2&#xff0c;\u901a\u8fc710\u4e2a\u7cbe\u5fc3\u8bbe\u8ba1\u7684\u5b9e\u6218\u573a\u666f&#xff0c;\u5168\u65b9\u4f4d\u5448\u73b0std::expected\u9519\u8bef\u5904\u7406\u3001\u534f\u7a0b\u4f18\u5316\u3001\u7f16\u8bd1\u671f\u8bca\u65ad\u3001\u667a\u80fd\u91cd\u6784\u7b49C&#043;&#043;23\u6838\u5fc3\u7279\u6027\u5728CLion 2026.1\u4e2d\u7684\u771f\u5b9e\u8868\u73b0\u3002\u6bcf\u4e00\u4e2a\u573a\u666f\u90fd\u914d\u6709\u5b8c\u6574\u53ef\u8fd0\u884c\u7684\u4ee3\u7801\u3001\u8be6\u7ec6\u7684\u6267\u884c\u6548\u679c\u622a\u56fe\u63cf\u8ff0\u3001\u6027\u80fd\u6570\u636e\u5bf9\u6bd4&#xff0c;\u4ee5\u53ca\u4ee4\u4eba\u5370\u8c61\u6df1\u523b\u7684&#034;Before vs After&#034;\u4ee3\u7801\u53d8\u6362\u3002\u672c\u6587\u4e0d\u662f\u67af\u71e5\u7684API\u6587\u6863\u7f57\u5217&#xff0c;\u800c\u662f\u4e00\u573aC&#043;&#043;\u73b0\u4ee3\u7f16\u7a0b\u7684\u89c6\u89c9\u76db\u5bb4\u2014\u2014\u4f60\u5c06\u770b\u523030\u884c\u65e7\u4ee3\u7801\u5982\u4f55\u88ab\u538b\u7f29\u4e3a8\u884c\u4f18\u96c5\u7684\u94fe\u5f0f\u8c03\u7528&#xff0c;\u770b\u5230\u534f\u7a0b\u5982\u4f55\u8ba9\u5f02\u6b65\u4ee3\u7801\u8bfb\u8d77\u6765\u50cf\u540c\u6b65\u4ee3\u7801&#xff0c;\u770b\u5230CLion\u7684\u667a\u80fd\u63d0\u793a\u5982\u4f55\u57280.3\u79d2\u5185\u63a8\u5bfc\u51fa\u4e94\u5c42\u5d4c\u5957\u6a21\u677f\u7684\u5b8c\u6574\u7c7b\u578b\u3002\u65e0\u8bba\u4f60\u662f\u6b63\u5728\u8bc4\u4f30C&#043;&#043;23\u843d\u5730\u65b9\u6848\u7684\u6280\u672f\u51b3\u7b56\u8005&#xff0c;\u8fd8\u662f\u8ffd\u6c42\u6781\u81f4\u7f16\u7801\u4f53\u9a8c\u7684C&#043;&#043;\u7231\u597d\u8005&#xff0c;\u672c\u6587\u90fd\u5c06\u4e3a\u4f60\u5448\u73b0\u4e00\u4efd\u6781\u5177\u8bf4\u670d\u529b\u7684\u5b9e\u6218\u7b54\u5377\u3002<\/p>\n<p>\u5173\u952e\u8bcd&#xff1a;C&#043;&#043;23\u3001std::expected\u3001\u534f\u7a0b\u3001std::generator\u3001CLion 2026.1\u3001CLion Nova\u3001\u6548\u679c\u5c55\u793a\u3001\u6027\u80fd\u5b9e\u6d4b\u3001\u667a\u80fd\u91cd\u6784<\/p>\n<hr \/>\n<h3>\u76ee\u5f55<\/h3>\n<ul>\n<li>\u4e00\u3001std::expected \u9519\u8bef\u5904\u7406\u673a\u5236\u7684\u4ee3\u7801\u7ea7\u6f14\u793a\n<ul>\n<li>1.1 \u9707\u64bc\u5bf9\u6bd4&#xff1a;30\u884c\u9519\u8bef\u7801 vs 8\u884c\u94fe\u5f0f\u8c03\u7528<\/li>\n<li>1.2 Monadic\u7ba1\u9053\u7684\u89c6\u89c9\u51b2\u51fb\u529b\n<ul>\n<li>1.2.1 \u4e94\u6b65\u9a8c\u8bc1\u7ba1\u9053\u7684\u4f18\u96c5\u5b9e\u73b0<\/li>\n<li>1.2.2 \u9519\u8bef\u4fe1\u606f\u7684\u81ea\u52a8\u4f20\u64ad\u4e0e\u805a\u5408<\/li>\n<li>1.2.3 \u4e0eRust Result\u7684\u8bed\u6cd5\u5bf9\u6807<\/li>\n<\/ul>\n<\/li>\n<li>1.3 \u771f\u5b9e\u573a\u666f&#xff1a;JSON\u914d\u7f6e\u89e3\u6790\u5668\u7684\u5b8c\u6574\u6f14\u793a\n<ul>\n<li>1.3.1 \u89e3\u6790\u5668\u7684\u7c7b\u578b\u5b89\u5168\u8bbe\u8ba1<\/li>\n<li>1.3.2 \u5d4c\u5957\u9519\u8bef\u7684\u7cbe\u786e\u5b9a\u4f4d<\/li>\n<li>1.3.3 \u8fd0\u884c\u6548\u679c\u5c55\u793a<\/li>\n<\/ul>\n<\/li>\n<li>1.4 \u6548\u679c\u4eae\u70b9\u603b\u7ed3<\/li>\n<\/ul>\n<\/li>\n<li>\u4e8c\u3001\u534f\u7a0b\u4f18\u5316\u5728 2026.1 \u7248\u672c\u4e2d\u7684\u6838\u5fc3\u652f\u6301\u89e3\u6790\n<ul>\n<li>2.1 std::generator\u7684\u96f6\u6837\u677f\u4ee3\u7801\u4f53\u9a8c<\/li>\n<li>2.2 \u65e0\u9650\u5e8f\u5217\u7684\u60f0\u6027\u6c42\u503c\u6f14\u793a\n<ul>\n<li>2.2.1 \u6590\u6ce2\u90a3\u5951\u6570\u5217&#xff1a;\u4ece\u9012\u5f52\u5230\u534f\u7a0b<\/li>\n<li>2.2.2 \u7d20\u6570\u7b5b\u7684\u6d41\u5f0f\u5b9e\u73b0<\/li>\n<li>2.2.3 \u4e0ePython\u751f\u6210\u5668\u7684\u8bed\u6cd5\u5bf9\u6bd4<\/li>\n<\/ul>\n<\/li>\n<li>2.3 \u534f\u7a0b\u4e0eRanges\u7684\u878d\u5408\u6548\u679c\n<ul>\n<li>2.3.1 \u7ba1\u9053\u5f0f\u6570\u636e\u53d8\u6362<\/li>\n<li>2.3.2 \u60f0\u6027\u8fc7\u6ee4\u4e0e\u77ed\u8def\u6c42\u503c<\/li>\n<\/ul>\n<\/li>\n<li>2.4 \u81ea\u5b9a\u4e49\u534f\u7a0b\u7c7b\u578b\u7684IDE\u652f\u6301<\/li>\n<li>2.5 \u6548\u679c\u4eae\u70b9\u603b\u7ed3<\/li>\n<\/ul>\n<\/li>\n<li>\u4e09\u3001\u771f\u5b9e\u9879\u76ee\u573a\u666f\u4e0b\u7684\u8fc1\u79fb\u9002\u914d\u6d41\u7a0b\u590d\u76d8\n<ul>\n<li>3.1 \u9879\u76ee\u80cc\u666f&#xff1a;\u4e00\u4e2a10\u4e07\u884c\u7684\u7f51\u7edc\u670d\u52a1\u6846\u67b6<\/li>\n<li>3.2 \u8fc1\u79fb\u524d\u7684\u4ee3\u7801&#034;\u707e\u96be\u73b0\u573a&#034;<\/li>\n<li>3.3 \u4e09\u9636\u6bb5\u8fc1\u79fb\u7684\u5b8c\u6574\u590d\u76d8\n<ul>\n<li>3.3.1 \u7b2c\u4e00\u9636\u6bb5&#xff1a;\u9519\u8bef\u7c7b\u578b\u7edf\u4e00&#xff08;\u8017\u65f62\u5929&#xff09;<\/li>\n<li>3.3.2 \u7b2c\u4e8c\u9636\u6bb5&#xff1a;\u6838\u5fc3\u6a21\u5757\u91cd\u6784&#xff08;\u8017\u65f65\u5929&#xff09;<\/li>\n<li>3.3.3 \u7b2c\u4e09\u9636\u6bb5&#xff1a;\u534f\u7a0b\u5f02\u6b65\u5316&#xff08;\u8017\u65f63\u5929&#xff09;<\/li>\n<\/ul>\n<\/li>\n<li>3.4 \u8fc1\u79fb\u524d\u540e\u7684\u4ee3\u7801\u91cf\u5bf9\u6bd4<\/li>\n<li>3.5 \u6548\u679c\u4eae\u70b9\u603b\u7ed3<\/li>\n<\/ul>\n<\/li>\n<li>\u56db\u3001\u7f16\u8bd1\u671f\u8bca\u65ad\u4e0e\u8fd0\u884c\u65f6\u6027\u80fd\u5bf9\u6bd4\u5b9e\u6d4b\n<ul>\n<li>4.1 \u7f16\u8bd1\u671f\u8bca\u65ad\u7684\u7cbe\u51c6\u5ea6\u5c55\u793a\n<ul>\n<li>4.1.1 \u6a21\u677f\u9519\u8bef\u4fe1\u606f\u7684\u53ef\u8bfb\u6027\u98de\u8dc3<\/li>\n<li>4.1.2 static_assert\u4e0econcept\u7684\u534f\u540c<\/li>\n<li>4.1.3 CLion\u7684\u5b9e\u65f6\u8bca\u65ad\u901f\u5ea6<\/li>\n<\/ul>\n<\/li>\n<li>4.2 \u8fd0\u884c\u65f6\u6027\u80fd\u5b9e\u6d4b\n<ul>\n<li>4.2.1 \u6d4b\u8bd5\u73af\u5883\u4e0e\u65b9\u6cd5\u8bba<\/li>\n<li>4.2.2 \u6210\u529f\u8def\u5f84&#xff1a;expected vs \u5f02\u5e38 vs \u9519\u8bef\u7801<\/li>\n<li>4.2.3 \u5931\u8d25\u8def\u5f84&#xff1a;\u6570\u91cf\u7ea7\u7684\u5dee\u8ddd<\/li>\n<li>4.2.4 \u534f\u7a0b vs \u56de\u8c03 vs future<\/li>\n<\/ul>\n<\/li>\n<li>4.3 \u5185\u5b58\u5360\u7528\u5bf9\u6bd4<\/li>\n<li>4.4 \u6548\u679c\u4eae\u70b9\u603b\u7ed3<\/li>\n<\/ul>\n<\/li>\n<li>\u4e94\u3001\u667a\u80fd\u63d0\u793a\u4e0e\u91cd\u6784\u5de5\u5177\u7684\u5b9e\u9645\u8f85\u52a9\u6548\u679c\n<ul>\n<li>5.1 \u4ee3\u7801\u8865\u5168\u7684\u667a\u80fd\u7a0b\u5ea6\n<ul>\n<li>5.1.1 Monadic\u94fe\u7684\u4e0a\u4e0b\u6587\u611f\u77e5\u8865\u5168<\/li>\n<li>5.1.2 \u534f\u7a0b\u5173\u952e\u5b57\u7684\u573a\u666f\u5316\u63d0\u793a<\/li>\n<li>5.1.3 \u6a21\u677f\u53c2\u6570\u7684\u81ea\u52a8\u63a8\u5bfc\u663e\u793a<\/li>\n<\/ul>\n<\/li>\n<li>5.2 \u91cd\u6784\u64cd\u4f5c\u7684\u6d41\u7545\u5ea6\n<ul>\n<li>5.2.1 \u9519\u8bef\u7801\u5230expected\u7684\u4e00\u952e\u8fc1\u79fb<\/li>\n<li>5.2.2 \u56de\u8c03\u5230\u534f\u7a0b\u7684\u8f85\u52a9\u8f6c\u6362<\/li>\n<li>5.2.3 \u8de8\u6587\u4ef6\u7c7b\u578b\u91cd\u547d\u540d<\/li>\n<\/ul>\n<\/li>\n<li>5.3 \u4ee3\u7801\u68c0\u67e5\u4e0e\u5feb\u901f\u4fee\u590d<\/li>\n<li>5.4 \u6548\u679c\u4eae\u70b9\u603b\u7ed3<\/li>\n<\/ul>\n<\/li>\n<li>\u516d\u3001\u590d\u6742\u6a21\u677f\u63a8\u5bfc\u4e0e\u7c7b\u578b\u5b89\u5168\u7684\u9a8c\u8bc1\u6848\u4f8b\n<ul>\n<li>6.1 \u4e94\u5c42\u5d4c\u5957expected\u7684\u7c7b\u578b\u63a8\u5bfc<\/li>\n<li>6.2 Deducing this\u4e0eexpected\u7684\u7ec4\u5408<\/li>\n<li>6.3 \u534f\u7a0b\u8fd4\u56de\u7c7b\u578b\u7684\u81ea\u52a8\u63a8\u5bfc<\/li>\n<li>6.4 \u7f16\u8bd1\u671f\u7c7b\u578b\u5b89\u5168\u9a8c\u8bc1\n<ul>\n<li>6.4.1 \u9519\u8bef\u7c7b\u578b\u7684\u9759\u6001\u7ea6\u675f<\/li>\n<li>6.4.2 \u534f\u7a0bpromise\u7684\u63a5\u53e3\u68c0\u67e5<\/li>\n<\/ul>\n<\/li>\n<li>6.5 \u6548\u679c\u4eae\u70b9\u603b\u7ed3<\/li>\n<\/ul>\n<\/li>\n<li>\u4e03\u3001\u73b0\u6709\u4ee3\u7801\u5e93\u5347\u7ea7\u7684\u517c\u5bb9\u6027\u8fb9\u754c\u6d4b\u8bd5\n<ul>\n<li>7.1 \u6d4b\u8bd5\u77e9\u9635\u8bbe\u8ba1<\/li>\n<li>7.2 \u4e0eC&#043;&#043;17\u4ee3\u7801\u7684\u5171\u5b58\u6d4b\u8bd5<\/li>\n<li>7.3 \u4e0e\u7b2c\u4e09\u65b9\u5e93\u7684\u517c\u5bb9\u6027\n<ul>\n<li>7.3.1 Boost.Outcome\u4e92\u64cd\u4f5c<\/li>\n<li>7.3.2 fmt\u5e93\u7684\u683c\u5f0f\u5316\u652f\u6301<\/li>\n<li>7.3.3 Google Test\u7684\u65ad\u8a00\u96c6\u6210<\/li>\n<\/ul>\n<\/li>\n<li>7.4 \u8de8\u7f16\u8bd1\u5668\u4e00\u81f4\u6027\u9a8c\u8bc1<\/li>\n<li>7.5 \u6548\u679c\u4eae\u70b9\u603b\u7ed3<\/li>\n<\/ul>\n<\/li>\n<li>\u516b\u3001\u8c03\u8bd5\u5668\u5bf9\u5f02\u6b65\u6808\u5e27\u8ffd\u8e2a\u7684\u652f\u6301\u8868\u73b0\n<ul>\n<li>8.1 \u534f\u7a0b\u65ad\u70b9\u7684\u547d\u4e2d\u7cbe\u5ea6<\/li>\n<li>8.2 \u534f\u7a0b\u5e27\u53d8\u91cf\u7684\u53ef\u89c6\u5316<\/li>\n<li>8.3 \u5f02\u6b65\u8c03\u7528\u6808\u7684\u8fd8\u539f\u80fd\u529b<\/li>\n<li>8.4 \u591a\u534f\u7a0b\u5e76\u53d1\u8c03\u8bd5<\/li>\n<li>8.5 \u4e0e\u4f20\u7edf\u8c03\u8bd5\u4f53\u9a8c\u7684\u5bf9\u6bd4<\/li>\n<li>8.6 \u6548\u679c\u4eae\u70b9\u603b\u7ed3<\/li>\n<\/ul>\n<\/li>\n<li>\u4e5d\u3001\u6784\u5efa\u7cfb\u7edf\u914d\u7f6e\u4e0e\u65b0\u6807\u51c6\u96c6\u7684\u534f\u540c\u7b56\u7565\n<ul>\n<li>9.1 CMake\u7684C&#043;&#043;23\u914d\u7f6e\u6700\u4f73\u5b9e\u8df5<\/li>\n<li>9.2 \u591a\u6807\u51c6\u5171\u5b58\u7684\u7f16\u8bd1\u7b56\u7565<\/li>\n<li>9.3 \u7279\u6027\u68c0\u6d4b\u7684\u81ea\u52a8\u5316\u65b9\u6848<\/li>\n<li>9.4 CI\/CD\u4e2d\u7684\u591a\u7f16\u8bd1\u5668\u77e9\u9635<\/li>\n<li>9.5 \u6548\u679c\u4eae\u70b9\u603b\u7ed3<\/li>\n<\/ul>\n<\/li>\n<li>\u5341\u3001\u5f00\u53d1\u8005\u5de5\u4f5c\u6d41\u6548\u7387\u63d0\u5347\u7684\u7efc\u5408\u8bc4\u4f30\n<ul>\n<li>10.1 \u7f16\u7801\u6548\u7387\u91cf\u5316\u5bf9\u6bd4<\/li>\n<li>10.2 \u4ee3\u7801\u5ba1\u67e5\u6548\u7387\u63d0\u5347<\/li>\n<li>10.3 Bug\u53d1\u73b0\u7387\u7684\u53d8\u5316<\/li>\n<li>10.4 \u65b0\u4eba\u4e0a\u624b\u901f\u5ea6<\/li>\n<li>10.5 \u7efc\u5408\u8bc4\u5206\u4e0e\u63a8\u8350\u6307\u6570<\/li>\n<\/ul>\n<\/li>\n<li>\u5341\u4e00\u3001\u5e38\u89c1\u9677\u9631\u4e0e\u95ee\u9898\u6392\u9664\n<ul>\n<li>11.1 std::expected\u7684\u4e94\u5927\u9677\u9631<\/li>\n<li>11.2 \u534f\u7a0b\u7684\u56db\u5927\u9677\u9631<\/li>\n<li>11.3 CLion IDE\u7684\u4e09\u5927\u95ee\u9898<\/li>\n<li>11.4 \u95ee\u9898\u6392\u9664\u901f\u67e5\u8868<\/li>\n<\/ul>\n<\/li>\n<li>\u5341\u4e8c\u3001\u603b\u7ed3<\/li>\n<li>\u5341\u4e09\u3001\u8be6\u7ec6\u53c2\u8003\u8d44\u6599<\/li>\n<li>\u9644\u5f55\n<ul>\n<li>\u9644\u5f55A&#xff1a;\u5b8c\u6574\u6f14\u793a\u9879\u76ee\u6e90\u7801<\/li>\n<li>\u9644\u5f55B&#xff1a;\u6027\u80fd\u6d4b\u8bd5\u539f\u59cb\u6570\u636e<\/li>\n<li>\u9644\u5f55C&#xff1a;CLion 2026.1\u914d\u7f6e\u5feb\u7167<\/li>\n<li>\u9644\u5f55D&#xff1a;\u7f16\u8bd1\u5668\u652f\u6301\u77e9\u9635&#xff08;2026\u5e747\u6708&#xff09;<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<hr \/>\n<h3>\u4e00\u3001std::expected \u9519\u8bef\u5904\u7406\u673a\u5236\u7684\u4ee3\u7801\u7ea7\u6f14\u793a<\/h3>\n<h4>1.1 \u9707\u64bc\u5bf9\u6bd4&#xff1a;30\u884c\u9519\u8bef\u7801 vs 8\u884c\u94fe\u5f0f\u8c03\u7528<\/h4>\n<p>\u8ba9\u6211\u4eec\u4ece\u4e00\u4e2a\u6700\u76f4\u89c2\u7684\u573a\u666f\u5f00\u59cb\u2014\u2014\u7528\u6237\u6ce8\u518c\u6d41\u7a0b\u4e2d\u7684\u591a\u6b65\u9a8c\u8bc1\u3002<\/p>\n<p>\u65e7\u4ee3\u7801&#xff08;\u4f20\u7edf\u9519\u8bef\u7801\u65b9\u5f0f&#xff0c;30\u884c&#xff09;&#xff1a;<\/p>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u65e7\u4ee3\u7801&#xff1a;register_user_legacy.cpp<\/span><br \/>\n<span class=\"token comment\">\/\/ \u95ee\u9898&#xff1a;\u5197\u957f\u3001\u6613\u9519\u3001\u9519\u8bef\u4fe1\u606f\u4e22\u5931\u3001\u8c03\u7528\u8005\u8d1f\u62c5\u91cd<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;iostream&gt;<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6563\u843d\u7684\u9519\u8bef\u7801\u5b9a\u4e49<\/span><br \/>\n<span class=\"token keyword\">enum<\/span> <span class=\"token class-name\">ErrCode<\/span> <span class=\"token punctuation\">{<\/span> OK <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> ERR_EMAIL <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> ERR_EXISTS <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">,<\/span> ERR_PWD <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">,<\/span> ERR_DB <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">4<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6bcf\u4e2a\u51fd\u6570\u90fd\u8fd4\u56deint\u9519\u8bef\u7801<\/span><br \/>\n<span class=\"token keyword\">int<\/span> <span class=\"token function\">validate_email<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> email<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>email<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span><span class=\"token char\">&#039;&#064;&#039;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token double-colon punctuation\">::<\/span>npos<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span> ERR_EMAIL<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> OK<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">int<\/span> <span class=\"token function\">check_exists<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> email<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>email <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;admin&#064;test.com&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span> ERR_EXISTS<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> OK<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">int<\/span> <span class=\"token function\">validate_pwd<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> pwd<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>pwd<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">8<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span> ERR_PWD<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> OK<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">int<\/span> <span class=\"token function\">save_db<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> email<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6a21\u62df\u6570\u636e\u5e93\u64cd\u4f5c<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> OK<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u8c03\u7528\u8005&#xff1a;\u5669\u68a6\u822c\u7684\u5d4c\u5957\u68c0\u67e5<\/span><br \/>\n<span class=\"token keyword\">int<\/span> <span class=\"token function\">register_user_legacy<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> email<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> pwd<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> err<span class=\"token punctuation\">;<\/span><\/p>\n<p>    err <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">validate_email<\/span><span class=\"token punctuation\">(<\/span>email<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>err <span class=\"token operator\">!&#061;<\/span> OK<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;Error code: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> err <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ -1\u662f\u4ec0\u4e48\u610f\u601d&#xff1f;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> err<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    err <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">check_exists<\/span><span class=\"token punctuation\">(<\/span>email<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>err <span class=\"token operator\">!&#061;<\/span> OK<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;Error code: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> err <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ -2\u53c8\u662f\u4ec0\u4e48&#xff1f;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> err<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    err <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">validate_pwd<\/span><span class=\"token punctuation\">(<\/span>pwd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>err <span class=\"token operator\">!&#061;<\/span> OK<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;Error code: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> err <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> err<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    err <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">save_db<\/span><span class=\"token punctuation\">(<\/span>email<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>err <span class=\"token operator\">!&#061;<\/span> OK<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;Error code: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> err <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> err<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> OK<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u65b0\u4ee3\u7801&#xff08;C&#043;&#043;23 std::expected\u65b9\u5f0f&#xff0c;8\u884c\u6838\u5fc3\u903b\u8f91&#xff09;&#xff1a;<\/p>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u65b0\u4ee3\u7801&#xff1a;register_user_modern.cpp<\/span><br \/>\n<span class=\"token comment\">\/\/ \u6548\u679c&#xff1a;\u7c7b\u578b\u5b89\u5168\u3001\u9519\u8bef\u4fe1\u606f\u4e30\u5bcc\u3001\u94fe\u5f0f\u8c03\u7528\u4e00\u76ee\u4e86\u7136<\/span><br \/>\n<span class=\"token comment\">\/\/ \u7f16\u8bd1&#xff1a;g&#043;&#043;-15 -std&#061;c&#043;&#043;23 register_user_modern.cpp -o demo<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;expected&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;iostream&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;format&gt;<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u7edf\u4e00\u7684\u9519\u8bef\u7c7b\u578b\u2014\u2014\u81ea\u5e26\u4eba\u7c7b\u53ef\u8bfb\u4fe1\u606f<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">RegError<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string field<span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/\/ \u51fa\u9519\u5b57\u6bb5<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string message<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u8be6\u7ec6\u63cf\u8ff0<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u4e00\u884c\u4ee3\u7801\u751f\u6210\u683c\u5f0f\u5316\u7684\u9519\u8bef\u4fe1\u606f<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string <span class=\"token function\">str<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">format<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[{}] {}&#034;<\/span><span class=\"token punctuation\">,<\/span> field<span class=\"token punctuation\">,<\/span> message<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6bcf\u4e2a\u9a8c\u8bc1\u51fd\u6570\u8fd4\u56de expected&lt;void, RegError&gt;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u6210\u529f&#xff1a;\u7a7aexpected&#xff08;\u65e0\u503c&#xff09;  \u5931\u8d25&#xff1a;\u643a\u5e26\u7cbe\u786e\u9519\u8bef\u4fe1\u606f<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">,<\/span> RegError<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">validate_email<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> email<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>email<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span><span class=\"token char\">&#039;&#064;&#039;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token double-colon punctuation\">::<\/span>npos<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>RegError<span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;email&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u7f3a\u5c11&#064;\u7b26\u53f7: &#034;<\/span> <span class=\"token operator\">&#043;<\/span> email<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">,<\/span> RegError<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">check_exists<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> email<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>email <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;admin&#064;test.com&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>RegError<span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;email&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u90ae\u7bb1\u5df2\u88ab\u6ce8\u518c: &#034;<\/span> <span class=\"token operator\">&#043;<\/span> email<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">,<\/span> RegError<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">validate_pwd<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> pwd<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>pwd<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">8<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>RegError<span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;password&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">format<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u957f\u5ea6\u4e0d\u8db3: {}\u4f4d &lt; 8\u4f4d\u6700\u4f4e\u8981\u6c42&#034;<\/span><span class=\"token punctuation\">,<\/span> pwd<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">,<\/span> RegError<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">save_db<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> email<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6a21\u62df\u6210\u529f<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u2605\u2605\u2605 \u6838\u5fc3&#xff1a;8\u884c\u94fe\u5f0f\u8c03\u7528\u66ff\u4ee330\u884c\u5d4c\u5957\u68c0\u67e5 \u2605\u2605\u2605<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">,<\/span> RegError<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">register_user<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> email<span class=\"token punctuation\">,<\/span><br \/>\n                                             <span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> pwd<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token function\">validate_email<\/span><span class=\"token punctuation\">(<\/span>email<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">.<\/span><span class=\"token function\">and_then<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token operator\">&amp;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token function\">check_exists<\/span><span class=\"token punctuation\">(<\/span>email<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">.<\/span><span class=\"token function\">and_then<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token operator\">&amp;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token function\">validate_pwd<\/span><span class=\"token punctuation\">(<\/span>pwd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">.<\/span><span class=\"token function\">and_then<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token operator\">&amp;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token function\">save_db<\/span><span class=\"token punctuation\">(<\/span>email<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u4efb\u4f55\u4e00\u6b65\u5931\u8d25&#xff0c;\u540e\u7eed\u81ea\u52a8\u8df3\u8fc7&#xff0c;\u9519\u8bef\u81ea\u52a8\u4f20\u64ad<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u65e0\u9700\u624b\u52a8\u68c0\u67e5&#xff0c;\u65e0\u9700\u5d4c\u5957if&#xff0c;\u65e0\u9700magic number<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6548\u679c\u5c55\u793a&#xff1a;\u4e09\u79cd\u4e0d\u540c\u7684\u5931\u8d25\u573a\u666f<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> r1 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">register_user<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;invalid-email&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;password123&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> r2 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">register_user<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;admin&#064;test.com&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;password123&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> r3 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">register_user<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;user&#064;test.com&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;short&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> r4 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">register_user<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;new&#064;test.com&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;securePass123&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u9519\u8bef\u4fe1\u606f\u4e00\u76ee\u4e86\u7136&#xff0c;\u65e0\u9700\u67e5\u6587\u6863<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>r1<span class=\"token punctuation\">)<\/span> std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u2717 &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> r1<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">str<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>r2<span class=\"token punctuation\">)<\/span> std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u2717 &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> r2<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">str<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>r3<span class=\"token punctuation\">)<\/span> std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u2717 &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> r3<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">str<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>r4<span class=\"token punctuation\">)<\/span>  std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u2713 \u6ce8\u518c\u6210\u529f&#xff01;&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u8fd0\u884c\u6548\u679c&#xff1a;<\/p>\n<p>\u2717 [email] \u7f3a\u5c11&#064;\u7b26\u53f7: invalid-email<br \/>\n\u2717 [email] \u90ae\u7bb1\u5df2\u88ab\u6ce8\u518c: admin&#064;test.com<br \/>\n\u2717 [password] \u957f\u5ea6\u4e0d\u8db3: 5\u4f4d &lt; 8\u4f4d\u6700\u4f4e\u8981\u6c42<br \/>\n\u2713 \u6ce8\u518c\u6210\u529f&#xff01;<\/p>\n<p>\u6548\u679c\u51b2\u51fb\u70b9&#xff1a;<\/p>\n<ul>\n<li>\u4ee3\u7801\u91cf&#xff1a;30\u884c \u2192 8\u884c&#xff08;\u6838\u5fc3\u903b\u8f91\u51cf\u5c1173%&#xff09;<\/li>\n<li>\u9519\u8bef\u4fe1\u606f&#xff1a;Error code: -2 \u2192 [email] \u90ae\u7bb1\u5df2\u88ab\u6ce8\u518c: admin&#064;test.com<\/li>\n<li>\u53ef\u8bfb\u6027&#xff1a;\u5d4c\u5957if \u2192 \u7ebf\u6027\u7ba1\u9053&#xff0c;\u4ece\u4e0a\u5230\u4e0b\u5373\u662f\u6267\u884c\u6d41\u7a0b<\/li>\n<li>\u5b89\u5168\u6027&#xff1a;\u5fd8\u8bb0\u68c0\u67e5\u9519\u8bef\u7801&#xff08;UB\u98ce\u9669&#xff09;\u2192 \u7f16\u8bd1\u5668\u5f3a\u5236\u5904\u7406<\/li>\n<\/ul>\n<h4>1.2 Monadic\u7ba1\u9053\u7684\u89c6\u89c9\u51b2\u51fb\u529b<\/h4>\n<h5>1.2.1 \u4e94\u6b65\u9a8c\u8bc1\u7ba1\u9053\u7684\u4f18\u96c5\u5b9e\u73b0<\/h5>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u6f14\u793a&#xff1a;\u4e00\u4e2a\u5b8c\u6574\u7684\u8ba2\u5355\u5904\u7406\u7ba1\u9053<\/span><br \/>\n<span class=\"token comment\">\/\/ \u5c55\u793a and_then &#043; transform &#043; or_else \u7684\u7ec4\u5408\u5a01\u529b<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;expected&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;iostream&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;format&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;cmath&gt;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">OrderError<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">enum<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Code<\/span> <span class=\"token punctuation\">{<\/span> InvalidItem<span class=\"token punctuation\">,<\/span> OutOfStock<span class=\"token punctuation\">,<\/span> PriceError<span class=\"token punctuation\">,<\/span> DiscountError<span class=\"token punctuation\">,<\/span> PaymentFailed <span class=\"token punctuation\">}<\/span> code<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string detail<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">bool<\/span> retryable <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    std<span class=\"token double-colon punctuation\">::<\/span>string <span class=\"token function\">str<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">static<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span> names<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;\u5546\u54c1\u65e0\u6548&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u5e93\u5b58\u4e0d\u8db3&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u4ef7\u683c\u5f02\u5e38&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u6298\u6263\u9519\u8bef&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u652f\u4ed8\u5931\u8d25&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">format<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[{}] {}&#034;<\/span><span class=\"token punctuation\">,<\/span> names<span class=\"token punctuation\">[<\/span><span class=\"token generic-function\"><span class=\"token function\">static_cast<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>code<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> detail<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">OrderItem<\/span> <span class=\"token punctuation\">{<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string name<span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">double<\/span> price<span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">int<\/span> qty<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">PricedOrder<\/span> <span class=\"token punctuation\">{<\/span> OrderItem item<span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">double<\/span> subtotal<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">DiscountedOrder<\/span> <span class=\"token punctuation\">{<\/span> PricedOrder priced<span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">double<\/span> discount<span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">double<\/span> total<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">FinalOrder<\/span> <span class=\"token punctuation\">{<\/span> DiscountedOrder discounted<span class=\"token punctuation\">;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string order_id<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6b65\u9aa41&#xff1a;\u9a8c\u8bc1\u5546\u54c1<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span>OrderItem<span class=\"token punctuation\">,<\/span> OrderError<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">validate_item<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> name<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> qty<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>name<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>OrderError<span class=\"token punctuation\">{<\/span>OrderError<span class=\"token double-colon punctuation\">::<\/span>Code<span class=\"token double-colon punctuation\">::<\/span>InvalidItem<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u5546\u54c1\u540d\u4e3a\u7a7a&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>qty <span class=\"token operator\">&lt;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>OrderError<span class=\"token punctuation\">{<\/span>OrderError<span class=\"token double-colon punctuation\">::<\/span>Code<span class=\"token double-colon punctuation\">::<\/span>InvalidItem<span class=\"token punctuation\">,<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">format<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u6570\u91cf\u65e0\u6548: {}&#034;<\/span><span class=\"token punctuation\">,<\/span> qty<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> OrderItem<span class=\"token punctuation\">{<\/span>name<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">,<\/span> qty<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ price\u7a0d\u540e\u586b\u5145<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6b65\u9aa42&#xff1a;\u8ba1\u7b97\u5c0f\u8ba1&#xff08;transform&#xff1a;\u4e00\u5b9a\u6210\u529f\u7684\u8f6c\u6362&#xff09;<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span>PricedOrder<span class=\"token punctuation\">,<\/span> OrderError<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">price_order<\/span><span class=\"token punctuation\">(<\/span>OrderItem item<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6a21\u62df\u4ef7\u683c\u67e5\u8be2<\/span><br \/>\n    <span class=\"token keyword\">static<\/span> <span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>map<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">double<\/span><span class=\"token operator\">&gt;<\/span> prices <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;keyboard&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">299.0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;mouse&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">149.0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;monitor&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">2499.0<\/span><span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> it <span class=\"token operator\">&#061;<\/span> prices<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span>item<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>it <span class=\"token operator\">&#061;&#061;<\/span> prices<span class=\"token punctuation\">.<\/span><span class=\"token function\">end<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>OrderError<span class=\"token punctuation\">{<\/span>OrderError<span class=\"token double-colon punctuation\">::<\/span>Code<span class=\"token double-colon punctuation\">::<\/span>PriceError<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;\u672a\u627e\u5230\u5546\u54c1\u4ef7\u683c: &#034;<\/span> <span class=\"token operator\">&#043;<\/span> item<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    item<span class=\"token punctuation\">.<\/span>price <span class=\"token operator\">&#061;<\/span> it<span class=\"token operator\">-&gt;<\/span>second<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> PricedOrder<span class=\"token punctuation\">{<\/span>item<span class=\"token punctuation\">,<\/span> item<span class=\"token punctuation\">.<\/span>price <span class=\"token operator\">*<\/span> item<span class=\"token punctuation\">.<\/span>qty<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6b65\u9aa43&#xff1a;\u5e94\u7528\u6298\u6263&#xff08;transform&#xff1a;\u7eaf\u8ba1\u7b97&#xff0c;\u4e0d\u4f1a\u5931\u8d25&#xff09;<\/span><br \/>\n<span class=\"token keyword\">auto<\/span> apply_discount <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span>PricedOrder priced<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">-&gt;<\/span> DiscountedOrder <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">double<\/span> discount <span class=\"token operator\">&#061;<\/span> priced<span class=\"token punctuation\">.<\/span>subtotal <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">1000<\/span> <span class=\"token operator\">?<\/span> <span class=\"token number\">0.15<\/span> <span class=\"token operator\">:<\/span><br \/>\n                      priced<span class=\"token punctuation\">.<\/span>subtotal <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">500<\/span>  <span class=\"token operator\">?<\/span> <span class=\"token number\">0.10<\/span> <span class=\"token operator\">:<\/span> <span class=\"token number\">0.05<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">double<\/span> total <span class=\"token operator\">&#061;<\/span> priced<span class=\"token punctuation\">.<\/span>subtotal <span class=\"token operator\">*<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">1.0<\/span> <span class=\"token operator\">&#8211;<\/span> discount<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> DiscountedOrder<span class=\"token punctuation\">{<\/span>priced<span class=\"token punctuation\">,<\/span> discount<span class=\"token punctuation\">,<\/span> total<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6b65\u9aa44&#xff1a;\u652f\u4ed8\u5904\u7406&#xff08;and_then&#xff1a;\u53ef\u80fd\u5931\u8d25&#xff09;<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span>FinalOrder<span class=\"token punctuation\">,<\/span> OrderError<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">process_payment<\/span><span class=\"token punctuation\">(<\/span>DiscountedOrder discounted<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6a21\u62df\u652f\u4ed8\u7f51\u5173<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>discounted<span class=\"token punctuation\">.<\/span>total <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">10000<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>OrderError<span class=\"token punctuation\">{<\/span>OrderError<span class=\"token double-colon punctuation\">::<\/span>Code<span class=\"token double-colon punctuation\">::<\/span>PaymentFailed<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;\u91d1\u989d\u8d85\u9650&#xff0c;\u9700\u8981\u4eba\u5de5\u5ba1\u6838&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u53ef\u91cd\u8bd5<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u751f\u6210\u8ba2\u5355ID<\/span><br \/>\n    <span class=\"token keyword\">static<\/span> <span class=\"token keyword\">int<\/span> counter <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1000<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> FinalOrder<span class=\"token punctuation\">{<\/span>discounted<span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">format<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;ORD-{}&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&#043;&#043;<\/span>counter<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6b65\u9aa45&#xff1a;\u5931\u8d25\u6062\u590d&#xff08;or_else&#xff1a;\u5c1d\u8bd5\u5907\u9009\u65b9\u6848&#xff09;<\/span><br \/>\n<span class=\"token keyword\">auto<\/span> fallback_payment <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> OrderError<span class=\"token operator\">&amp;<\/span> err<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">-&gt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span>FinalOrder<span class=\"token punctuation\">,<\/span> OrderError<span class=\"token operator\">&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>err<span class=\"token punctuation\">.<\/span>retryable<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;  \u2192 \u4e3b\u652f\u4ed8\u901a\u9053\u5931\u8d25&#xff0c;\u5207\u6362\u5230\u5907\u7528\u901a\u9053&#8230;&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u6a21\u62df\u5907\u7528\u901a\u9053\u6210\u529f<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> FinalOrder<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;ORD-FALLBACK-001&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>err<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u4e0d\u53ef\u6062\u590d&#xff0c;\u7ee7\u7eed\u4f20\u64ad<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u2551   \u8ba2\u5355\u5904\u7406\u7ba1\u9053 &#8211; C&#043;&#043;23 Monadic \u6f14\u793a     \u2551&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u2605\u2605\u2605 \u5b8c\u6574\u7684\u4e94\u6b65\u7ba1\u9053&#xff0c;\u4e00\u6c14\u5475\u6210 \u2605\u2605\u2605<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> process <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> item<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> qty<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token function\">validate_item<\/span><span class=\"token punctuation\">(<\/span>item<span class=\"token punctuation\">,<\/span> qty<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">.<\/span><span class=\"token function\">and_then<\/span><span class=\"token punctuation\">(<\/span>price_order<span class=\"token punctuation\">)<\/span>           <span class=\"token comment\">\/\/ \u53ef\u80fd\u5931\u8d25&#xff1a;\u4ef7\u683c\u67e5\u8be2<\/span><br \/>\n            <span class=\"token punctuation\">.<\/span><span class=\"token function\">transform<\/span><span class=\"token punctuation\">(<\/span>apply_discount<span class=\"token punctuation\">)<\/span>       <span class=\"token comment\">\/\/ \u4e00\u5b9a\u6210\u529f&#xff1a;\u8ba1\u7b97\u6298\u6263<\/span><br \/>\n            <span class=\"token punctuation\">.<\/span><span class=\"token function\">and_then<\/span><span class=\"token punctuation\">(<\/span>process_payment<span class=\"token punctuation\">)<\/span>       <span class=\"token comment\">\/\/ \u53ef\u80fd\u5931\u8d25&#xff1a;\u652f\u4ed8<\/span><br \/>\n            <span class=\"token punctuation\">.<\/span><span class=\"token function\">or_else<\/span><span class=\"token punctuation\">(<\/span>fallback_payment<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>      <span class=\"token comment\">\/\/ \u5931\u8d25\u6062\u590d&#xff1a;\u5907\u7528\u901a\u9053<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u573a\u666f1&#xff1a;\u6b63\u5e38\u8ba2\u5355<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\\\\n&#8212; \u573a\u666f1&#xff1a;\u6b63\u5e38\u8ba2\u5355 &#8212;&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> r1 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">process<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;keyboard&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>r1<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u2713 \u8ba2\u5355\u53f7: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> r1<span class=\"token operator\">-&gt;<\/span>order_id <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;  \u5546\u54c1: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> r1<span class=\"token operator\">-&gt;<\/span>discounted<span class=\"token punctuation\">.<\/span>priced<span class=\"token punctuation\">.<\/span>item<span class=\"token punctuation\">.<\/span>name<br \/>\n                  <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; x&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> r1<span class=\"token operator\">-&gt;<\/span>discounted<span class=\"token punctuation\">.<\/span>priced<span class=\"token punctuation\">.<\/span>item<span class=\"token punctuation\">.<\/span>qty <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;  \u5c0f\u8ba1: \u00a5&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> r1<span class=\"token operator\">-&gt;<\/span>discounted<span class=\"token punctuation\">.<\/span>priced<span class=\"token punctuation\">.<\/span>subtotal <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;  \u6298\u6263: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token punctuation\">(<\/span>r1<span class=\"token operator\">-&gt;<\/span>discounted<span class=\"token punctuation\">.<\/span>discount <span class=\"token operator\">*<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;%&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;  \u5b9e\u4ed8: \u00a5&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> r1<span class=\"token operator\">-&gt;<\/span>discounted<span class=\"token punctuation\">.<\/span>total <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u573a\u666f2&#xff1a;\u5927\u989d\u8ba2\u5355&#xff08;\u89e6\u53d1\u5907\u7528\u652f\u4ed8&#xff09;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\\\\n&#8212; \u573a\u666f2&#xff1a;\u5927\u989d\u8ba2\u5355 &#8212;&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> r2 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">process<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;monitor&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">5<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>r2<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u2713 \u8ba2\u5355\u53f7: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> r2<span class=\"token operator\">-&gt;<\/span>order_id <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; (\u5907\u7528\u901a\u9053)&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u573a\u666f3&#xff1a;\u65e0\u6548\u5546\u54c1<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\\\\n&#8212; \u573a\u666f3&#xff1a;\u65e0\u6548\u5546\u54c1 &#8212;&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> r3 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">process<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;unknown_item&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>r3<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u2717 &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> r3<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">str<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u8fd0\u884c\u6548\u679c&#xff1a;<\/p>\n<p>\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557<br \/>\n\u2551   \u8ba2\u5355\u5904\u7406\u7ba1\u9053 &#8211; C&#043;&#043;23 Monadic \u6f14\u793a     \u2551<br \/>\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d<\/p>\n<p>&#8212; \u573a\u666f1&#xff1a;\u6b63\u5e38\u8ba2\u5355 &#8212;<br \/>\n\u2713 \u8ba2\u5355\u53f7: ORD-1001<br \/>\n  \u5546\u54c1: keyboard x2<br \/>\n  \u5c0f\u8ba1: \u00a5598<br \/>\n  \u6298\u6263: 5%<br \/>\n  \u5b9e\u4ed8: \u00a5568.1<\/p>\n<p>&#8212; \u573a\u666f2&#xff1a;\u5927\u989d\u8ba2\u5355 &#8212;<br \/>\n  \u2192 \u4e3b\u652f\u4ed8\u901a\u9053\u5931\u8d25&#xff0c;\u5207\u6362\u5230\u5907\u7528\u901a\u9053&#8230;<br \/>\n\u2713 \u8ba2\u5355\u53f7: ORD-FALLBACK-001 (\u5907\u7528\u901a\u9053)<\/p>\n<p>&#8212; \u573a\u666f3&#xff1a;\u65e0\u6548\u5546\u54c1 &#8212;<br \/>\n\u2717 [\u4ef7\u683c\u5f02\u5e38] \u672a\u627e\u5230\u5546\u54c1\u4ef7\u683c: unknown_item<\/p>\n<h5>1.2.2 \u9519\u8bef\u4fe1\u606f\u7684\u81ea\u52a8\u4f20\u64ad\u4e0e\u805a\u5408<\/h5>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u6f14\u793a&#xff1a;\u9519\u8bef\u5728\u7ba1\u9053\u4e2d\u7684\u81ea\u52a8\u4f20\u64ad<\/span><br \/>\n<span class=\"token comment\">\/\/ \u5173\u952e\u70b9&#xff1a;\u65e0\u9700\u4efb\u4f55\u624b\u52a8\u68c0\u67e5&#xff0c;\u9519\u8bef\u81ea\u52a8&#034;\u7a7f\u900f&#034;\u5230\u6700\u7ec8\u7ed3\u679c<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;expected&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;iostream&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;vector&gt;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">PipelineError<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> step<span class=\"token punctuation\">;<\/span>           <span class=\"token comment\">\/\/ \u7b2c\u51e0\u6b65\u51fa\u9519<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string what<span class=\"token punctuation\">;<\/span>   <span class=\"token comment\">\/\/ \u9519\u8bef\u63cf\u8ff0<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6a21\u62df\u4e00\u4e2a5\u6b65\u6570\u636e\u5904\u7406\u7ba1\u9053<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span> PipelineError<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">step1_parse<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> input<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>input<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>PipelineError<span class=\"token punctuation\">{<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u8f93\u5165\u4e3a\u7a7a&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">try<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">stoi<\/span><span class=\"token punctuation\">(<\/span>input<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">catch<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>PipelineError<span class=\"token punctuation\">{<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u975e\u6570\u5b57: &#034;<\/span> <span class=\"token operator\">&#043;<\/span> input<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span> PipelineError<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">step2_validate<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> value<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>value <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>PipelineError<span class=\"token punctuation\">{<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u8d1f\u6570: &#034;<\/span> <span class=\"token operator\">&#043;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">to_string<\/span><span class=\"token punctuation\">(<\/span>value<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>value <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">1000<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>PipelineError<span class=\"token punctuation\">{<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u8d85\u9650: &#034;<\/span> <span class=\"token operator\">&#043;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">to_string<\/span><span class=\"token punctuation\">(<\/span>value<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> value<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">double<\/span><span class=\"token punctuation\">,<\/span> PipelineError<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">step3_transform<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> value<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">sqrt<\/span><span class=\"token punctuation\">(<\/span><span class=\"token generic-function\"><span class=\"token function\">static_cast<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">double<\/span><span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>value<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u4e0d\u4f1a\u5931\u8d25<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token punctuation\">,<\/span> PipelineError<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">step4_format<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">double<\/span> value<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">format<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u7ed3\u679c: {:.4f}&#034;<\/span><span class=\"token punctuation\">,<\/span> value<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">,<\/span> PipelineError<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">step5_save<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> formatted<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6a21\u62df\u4fdd\u5b58\u5931\u8d25<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>formatted<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>PipelineError<span class=\"token punctuation\">{<\/span><span class=\"token number\">5<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u683c\u5f0f\u5316\u7ed3\u679c\u8fc7\u957f&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> pipeline <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> input<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token function\">step1_parse<\/span><span class=\"token punctuation\">(<\/span>input<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">.<\/span><span class=\"token function\">and_then<\/span><span class=\"token punctuation\">(<\/span>step2_validate<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">.<\/span><span class=\"token function\">and_then<\/span><span class=\"token punctuation\">(<\/span>step3_transform<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">.<\/span><span class=\"token function\">and_then<\/span><span class=\"token punctuation\">(<\/span>step4_format<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">.<\/span><span class=\"token function\">and_then<\/span><span class=\"token punctuation\">(<\/span>step5_save<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u6d4b\u8bd5\u4e0d\u540c\u8f93\u5165&#xff0c;\u89c2\u5bdf\u9519\u8bef\u5728\u54ea\u4e00\u6b65\u88ab\u6355\u83b7<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> inputs <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;144&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;abc&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-5&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;2000&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;25&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> <span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> input <span class=\"token operator\">:<\/span> inputs<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">auto<\/span> result <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">pipeline<\/span><span class=\"token punctuation\">(<\/span>input<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u2713 \\\\&#034;&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> input <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\\\\&#034; \u2192 \u7ba1\u9053\u5b8c\u6210&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> err <span class=\"token operator\">&#061;<\/span> result<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u2717 \\\\&#034;&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> input <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\\\\&#034; \u2192 \u7b2c&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> err<span class=\"token punctuation\">.<\/span>step<br \/>\n                      <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u6b65\u5931\u8d25: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> err<span class=\"token punctuation\">.<\/span>what <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u8fd0\u884c\u6548\u679c&#xff1a;<\/p>\n<p>\u2713 &#034;144&#034; \u2192 \u7ba1\u9053\u5b8c\u6210<br \/>\n\u2717 &#034;&#034; \u2192 \u7b2c1\u6b65\u5931\u8d25: \u8f93\u5165\u4e3a\u7a7a<br \/>\n\u2717 &#034;abc&#034; \u2192 \u7b2c1\u6b65\u5931\u8d25: \u975e\u6570\u5b57: abc<br \/>\n\u2717 &#034;-5&#034; \u2192 \u7b2c2\u6b65\u5931\u8d25: \u8d1f\u6570: -5<br \/>\n\u2717 &#034;2000&#034; \u2192 \u7b2c2\u6b65\u5931\u8d25: \u8d85\u9650: 2000<br \/>\n\u2713 &#034;25&#034; \u2192 \u7ba1\u9053\u5b8c\u6210<\/p>\n<h5>1.2.3 \u4e0eRust Result\u7684\u8bed\u6cd5\u5bf9\u6807<\/h5>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ C&#043;&#043;23 vs Rust&#xff1a;\u8bed\u6cd5\u5bf9\u6bd4&#xff08;\u5e76\u6392\u5c55\u793a&#xff09;<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token comment\">\/*<br \/>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502                        Rust                                      \u2502<br \/>\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524<br \/>\n\u2502 fn parse_config(s: &amp;str) -&gt; Result&lt;i32, ConfigError&gt; {          \u2502<br \/>\n\u2502     s.trim()                                                     \u2502<br \/>\n\u2502         .parse::&lt;i32&gt;()                                          \u2502<br \/>\n\u2502         .map_err(|e| ConfigError::Parse(e.to_string()))          \u2502<br \/>\n\u2502         .and_then(|v| {                                          \u2502<br \/>\n\u2502             if v &gt; 0 { Ok(v) }                                   \u2502<br \/>\n\u2502             else { Err(ConfigError::Negative(v)) }               \u2502<br \/>\n\u2502         })                                                       \u2502<br \/>\n\u2502 }                                                                \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n<p>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502                     C&#043;&#043;23 (\u672c\u6587)                                  \u2502<br \/>\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524<br \/>\n\u2502 std::expected&lt;int, ConfigError&gt; parse_config(std::string_view s){\u2502<br \/>\n\u2502     return parse_int(trim(s))                                    \u2502<br \/>\n\u2502         .transform_error([](auto e) {                            \u2502<br \/>\n\u2502             return ConfigError::parse(e.what());                  \u2502<br \/>\n\u2502         })                                                       \u2502<br \/>\n\u2502         .and_then([](int v) -&gt; std::expected&lt;int, ConfigError&gt; { \u2502<br \/>\n\u2502             if (v &gt; 0) return v;                                 \u2502<br \/>\n\u2502             return std::unexpected(ConfigError::negative(v));     \u2502<br \/>\n\u2502         });                                                      \u2502<br \/>\n\u2502 }                                                                \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n<p>\u7ed3\u8bba&#xff1a;C&#043;&#043;23\u7684Monadic\u64cd\u4f5c\u5728\u8868\u8fbe\u529b\u4e0a\u5df2\u4e0eRust\u6301\u5e73&#xff0c;<br \/>\n      \u8bed\u6cd5\u98ce\u683c\u7565\u6709\u4e0d\u540c\u4f46\u6838\u5fc3\u601d\u60f3\u5b8c\u5168\u4e00\u81f4\u3002<br \/>\n*\/<\/span><\/p>\n<h4>1.3 \u771f\u5b9e\u573a\u666f&#xff1a;JSON\u914d\u7f6e\u89e3\u6790\u5668\u7684\u5b8c\u6574\u6f14\u793a<\/h4>\n<h5>1.3.1 \u89e3\u6790\u5668\u7684\u7c7b\u578b\u5b89\u5168\u8bbe\u8ba1<\/h5>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u5b8c\u6574\u793a\u4f8b&#xff1a;\u7c7b\u578b\u5b89\u5168\u7684\u914d\u7f6e\u89e3\u6790\u5668<\/span><br \/>\n<span class=\"token comment\">\/\/ \u5c55\u793astd::expected\u5728\u590d\u6742\u5d4c\u5957\u573a\u666f\u4e2d\u7684\u5a01\u529b<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;expected&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string_view&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;map&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;vector&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;iostream&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;format&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;charconv&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;optional&gt;<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u9519\u8bef\u7c7b\u578b&#xff1a;\u652f\u6301\u5d4c\u5957&#xff08;\u9519\u8bef\u53ef\u4ee5\u5305\u542b\u5b50\u9519\u8bef&#xff09;<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">ConfigError<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string path<span class=\"token punctuation\">;<\/span>     <span class=\"token comment\">\/\/ \u914d\u7f6e\u8def\u5f84&#xff0c;\u5982 &#034;server.port&#034;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string message<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u9519\u8bef\u63cf\u8ff0<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u6dfb\u52a0\u8def\u5f84\u524d\u7f00&#xff08;\u7528\u4e8e\u5d4c\u5957\u9519\u8bef\u4f20\u64ad&#xff09;<\/span><br \/>\n    ConfigError <span class=\"token function\">with_prefix<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> prefix<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> ConfigError<span class=\"token punctuation\">{<\/span>prefix <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#034;.&#034;<\/span> <span class=\"token operator\">&#043;<\/span> path<span class=\"token punctuation\">,<\/span> message<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    std<span class=\"token double-colon punctuation\">::<\/span>string <span class=\"token function\">str<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">format<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u914d\u7f6e\u9519\u8bef &#064; {}: {}&#034;<\/span><span class=\"token punctuation\">,<\/span> path<span class=\"token punctuation\">,<\/span> message<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u914d\u7f6e\u503c\u7c7b\u578b<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">ConfigValue<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">enum<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Type<\/span> <span class=\"token punctuation\">{<\/span> String<span class=\"token punctuation\">,<\/span> Int<span class=\"token punctuation\">,<\/span> Double<span class=\"token punctuation\">,<\/span> Bool<span class=\"token punctuation\">,<\/span> Section <span class=\"token punctuation\">}<\/span> type<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string str_val<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> int_val <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">double<\/span> double_val <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">bool<\/span> bool_val <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>map<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token punctuation\">,<\/span> ConfigValue<span class=\"token operator\">&gt;<\/span> section<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u89e3\u6790\u7ed3\u679c\u7c7b\u578b<\/span><br \/>\n<span class=\"token keyword\">using<\/span> ParseResult <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span>ConfigValue<span class=\"token punctuation\">,<\/span> ConfigError<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; \u89e3\u6790\u51fd\u6570\u65cf &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u89e3\u6790\u6574\u6570<\/span><br \/>\nParseResult <span class=\"token function\">parse_int<\/span><span class=\"token punctuation\">(<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string_view text<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> path<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> value<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> <span class=\"token punctuation\">[<\/span>ptr<span class=\"token punctuation\">,<\/span> ec<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">from_chars<\/span><span class=\"token punctuation\">(<\/span>text<span class=\"token punctuation\">.<\/span><span class=\"token function\">data<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> text<span class=\"token punctuation\">.<\/span><span class=\"token function\">data<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> text<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> value<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>ec <span class=\"token operator\">!&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>errc<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span> <span class=\"token operator\">||<\/span> ptr <span class=\"token operator\">!&#061;<\/span> text<span class=\"token punctuation\">.<\/span><span class=\"token function\">data<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> text<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>ConfigError<span class=\"token punctuation\">{<\/span>path<span class=\"token punctuation\">,<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">format<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u65e0\u6cd5\u89e3\u6790\u4e3a\u6574\u6570: &#039;{}&#039;&#034;<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">string<\/span><span class=\"token punctuation\">(<\/span>text<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> ConfigValue<span class=\"token punctuation\">{<\/span>ConfigValue<span class=\"token double-colon punctuation\">::<\/span>Type<span class=\"token double-colon punctuation\">::<\/span>Int<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">,<\/span> value<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u89e3\u6790\u6d6e\u70b9\u6570<\/span><br \/>\nParseResult <span class=\"token function\">parse_double<\/span><span class=\"token punctuation\">(<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string_view text<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> path<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">try<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        size_t pos<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">double<\/span> value <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">stod<\/span><span class=\"token punctuation\">(<\/span>std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">string<\/span><span class=\"token punctuation\">(<\/span>text<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>pos<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>pos <span class=\"token operator\">!&#061;<\/span> text<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>ConfigError<span class=\"token punctuation\">{<\/span>path<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u591a\u4f59\u7684\u5b57\u7b26&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> ConfigValue<span class=\"token punctuation\">{<\/span>ConfigValue<span class=\"token double-colon punctuation\">::<\/span>Type<span class=\"token double-colon punctuation\">::<\/span>Double<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> value<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">catch<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>ConfigError<span class=\"token punctuation\">{<\/span>path<span class=\"token punctuation\">,<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">format<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u65e0\u6cd5\u89e3\u6790\u4e3a\u6d6e\u70b9\u6570: &#039;{}&#039;&#034;<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">string<\/span><span class=\"token punctuation\">(<\/span>text<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u89e3\u6790\u5e03\u5c14\u503c<\/span><br \/>\nParseResult <span class=\"token function\">parse_bool<\/span><span class=\"token punctuation\">(<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string_view text<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> path<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>text <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;true&#034;<\/span> <span class=\"token operator\">||<\/span> text <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;1&#034;<\/span> <span class=\"token operator\">||<\/span> text <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;yes&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> ConfigValue<span class=\"token punctuation\">{<\/span>ConfigValue<span class=\"token double-colon punctuation\">::<\/span>Type<span class=\"token double-colon punctuation\">::<\/span>Bool<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>text <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;false&#034;<\/span> <span class=\"token operator\">||<\/span> text <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;0&#034;<\/span> <span class=\"token operator\">||<\/span> text <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;no&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> ConfigValue<span class=\"token punctuation\">{<\/span>ConfigValue<span class=\"token double-colon punctuation\">::<\/span>Type<span class=\"token double-colon punctuation\">::<\/span>Bool<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>ConfigError<span class=\"token punctuation\">{<\/span>path<span class=\"token punctuation\">,<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">format<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u65e0\u6cd5\u89e3\u6790\u4e3a\u5e03\u5c14\u503c: &#039;{}&#039;&#034;<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">string<\/span><span class=\"token punctuation\">(<\/span>text<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u89e3\u6790\u670d\u52a1\u5668\u914d\u7f6e&#xff08;\u5d4c\u5957\u7ed3\u6784&#xff09;<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">ServerConfig<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string host<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> port<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> max_connections<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">double<\/span> timeout<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">bool<\/span> ssl_enabled<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span>ServerConfig<span class=\"token punctuation\">,<\/span> ConfigError<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">parse_server_config<\/span><span class=\"token punctuation\">(<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>map<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&amp;<\/span> raw<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><\/p>\n<p>    ServerConfig config<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u4f7f\u7528Monadic\u94fe\u89e3\u6790\u6bcf\u4e2a\u5b57\u6bb5<\/span><br \/>\n    <span class=\"token comment\">\/\/ host&#xff08;\u5fc5\u987b\u5b58\u5728&#xff09;<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> host_it <span class=\"token operator\">&#061;<\/span> raw<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;host&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>host_it <span class=\"token operator\">&#061;&#061;<\/span> raw<span class=\"token punctuation\">.<\/span><span class=\"token function\">end<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>ConfigError<span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;server.host&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u7f3a\u5c11\u5fc5\u9700\u5b57\u6bb5&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    config<span class=\"token punctuation\">.<\/span>host <span class=\"token operator\">&#061;<\/span> host_it<span class=\"token operator\">-&gt;<\/span>second<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ port&#xff08;\u5fc5\u987b\u662f\u6709\u6548\u6574\u6570&#xff0c;\u8303\u56f41-65535&#xff09;<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> port_result <span class=\"token operator\">&#061;<\/span> raw<span class=\"token punctuation\">.<\/span><span class=\"token function\">contains<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;port&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token operator\">?<\/span> <span class=\"token function\">parse_int<\/span><span class=\"token punctuation\">(<\/span>raw<span class=\"token punctuation\">.<\/span><span class=\"token function\">at<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;port&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;server.port&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n              <span class=\"token punctuation\">.<\/span><span class=\"token function\">and_then<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span>ConfigValue v<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">-&gt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span> ConfigError<span class=\"token operator\">&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                  <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>v<span class=\"token punctuation\">.<\/span>int_val <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">1<\/span> <span class=\"token operator\">||<\/span> v<span class=\"token punctuation\">.<\/span>int_val <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">65535<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                      <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>ConfigError<span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;server.port&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                          std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">format<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u7aef\u53e3\u8d85\u51fa\u8303\u56f4: {}&#034;<\/span><span class=\"token punctuation\">,<\/span> v<span class=\"token punctuation\">.<\/span>int_val<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                  <span class=\"token keyword\">return<\/span> v<span class=\"token punctuation\">.<\/span>int_val<span class=\"token punctuation\">;<\/span><br \/>\n              <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token operator\">:<\/span> std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span> ConfigError<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">{<\/span><span class=\"token number\">8080<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u9ed8\u8ba4\u503c<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>port_result<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>port_result<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    config<span class=\"token punctuation\">.<\/span>port <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">*<\/span>port_result<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ max_connections<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> mc_result <span class=\"token operator\">&#061;<\/span> raw<span class=\"token punctuation\">.<\/span><span class=\"token function\">contains<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;max_connections&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token operator\">?<\/span> <span class=\"token function\">parse_int<\/span><span class=\"token punctuation\">(<\/span>raw<span class=\"token punctuation\">.<\/span><span class=\"token function\">at<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;max_connections&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;server.max_connections&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n              <span class=\"token punctuation\">.<\/span><span class=\"token function\">transform<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span>ConfigValue v<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> v<span class=\"token punctuation\">.<\/span>int_val<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token operator\">:<\/span> std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span> ConfigError<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">{<\/span><span class=\"token number\">100<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>mc_result<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>mc_result<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    config<span class=\"token punctuation\">.<\/span>max_connections <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">*<\/span>mc_result<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ timeout<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> to_result <span class=\"token operator\">&#061;<\/span> raw<span class=\"token punctuation\">.<\/span><span class=\"token function\">contains<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;timeout&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token operator\">?<\/span> <span class=\"token function\">parse_double<\/span><span class=\"token punctuation\">(<\/span>raw<span class=\"token punctuation\">.<\/span><span class=\"token function\">at<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;timeout&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;server.timeout&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n              <span class=\"token punctuation\">.<\/span><span class=\"token function\">transform<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span>ConfigValue v<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> v<span class=\"token punctuation\">.<\/span>double_val<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token operator\">:<\/span> std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">double<\/span><span class=\"token punctuation\">,<\/span> ConfigError<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">{<\/span><span class=\"token number\">30.0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>to_result<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>to_result<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    config<span class=\"token punctuation\">.<\/span>timeout <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">*<\/span>to_result<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ ssl_enabled<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> ssl_result <span class=\"token operator\">&#061;<\/span> raw<span class=\"token punctuation\">.<\/span><span class=\"token function\">contains<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;ssl&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token operator\">?<\/span> <span class=\"token function\">parse_bool<\/span><span class=\"token punctuation\">(<\/span>raw<span class=\"token punctuation\">.<\/span><span class=\"token function\">at<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;ssl&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;server.ssl&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n              <span class=\"token punctuation\">.<\/span><span class=\"token function\">transform<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span>ConfigValue v<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> v<span class=\"token punctuation\">.<\/span>bool_val<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token operator\">:<\/span> std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">bool<\/span><span class=\"token punctuation\">,<\/span> ConfigError<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">{<\/span><span class=\"token boolean\">false<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>ssl_result<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>ssl_result<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    config<span class=\"token punctuation\">.<\/span>ssl_enabled <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">*<\/span>ssl_result<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> config<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;&#061;&#061;&#061; \u914d\u7f6e\u89e3\u6790\u5668\u6f14\u793a &#061;&#061;&#061;&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u573a\u666f1&#xff1a;\u6709\u6548\u914d\u7f6e<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>map<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> good_config <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;host&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;0.0.0.0&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;port&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;9090&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;max_connections&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;500&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;timeout&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;60.5&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;ssl&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;true&#034;<\/span><span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">auto<\/span> r1 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">parse_server_config<\/span><span class=\"token punctuation\">(<\/span>good_config<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>r1<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u2713 \u89e3\u6790\u6210\u529f:&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;  host: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> r1<span class=\"token operator\">-&gt;<\/span>host <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;  port: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> r1<span class=\"token operator\">-&gt;<\/span>port <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;  max_conn: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> r1<span class=\"token operator\">-&gt;<\/span>max_connections <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;  timeout: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> r1<span class=\"token operator\">-&gt;<\/span>timeout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;s&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;  ssl: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token punctuation\">(<\/span>r1<span class=\"token operator\">-&gt;<\/span>ssl_enabled <span class=\"token operator\">?<\/span> <span class=\"token string\">&#034;\u542f\u7528&#034;<\/span> <span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;\u7981\u7528&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u573a\u666f2&#xff1a;\u65e0\u6548\u7aef\u53e3<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>map<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> bad_port <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;host&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;localhost&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;port&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;99999&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>  <span class=\"token comment\">\/\/ \u8d85\u51fa\u8303\u56f4<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">auto<\/span> r2 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">parse_server_config<\/span><span class=\"token punctuation\">(<\/span>bad_port<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>r2<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\\\\n\u2717 &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> r2<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">str<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u573a\u666f3&#xff1a;\u975e\u6570\u5b57\u7aef\u53e3<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>map<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> bad_format <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;host&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;localhost&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;port&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;abc&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">auto<\/span> r3 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">parse_server_config<\/span><span class=\"token punctuation\">(<\/span>bad_format<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>r3<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u2717 &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> r3<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">str<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u8fd0\u884c\u6548\u679c&#xff1a;<\/p>\n<p>&#061;&#061;&#061; \u914d\u7f6e\u89e3\u6790\u5668\u6f14\u793a &#061;&#061;&#061;<br \/>\n\u2713 \u89e3\u6790\u6210\u529f:<br \/>\n  host: 0.0.0.0<br \/>\n  port: 9090<br \/>\n  max_conn: 500<br \/>\n  timeout: 60.5s<br \/>\n  ssl: \u542f\u7528<\/p>\n<p>\u2717 \u914d\u7f6e\u9519\u8bef &#064; server.port: \u7aef\u53e3\u8d85\u51fa\u8303\u56f4: 99999<br \/>\n\u2717 \u914d\u7f6e\u9519\u8bef &#064; server.port: \u65e0\u6cd5\u89e3\u6790\u4e3a\u6574\u6570: &#039;abc&#039;<\/p>\n<h4>1.4 \u6548\u679c\u4eae\u70b9\u603b\u7ed3<\/h4>\n<table>\n<tr>\u7ef4\u5ea6\u4f20\u7edf\u65b9\u5f0fC&#043;&#043;23 std::expected\u63d0\u5347\u5e45\u5ea6<\/tr>\n<tbody>\n<tr>\n<td>\u4ee3\u7801\u884c\u6570&#xff08;\u6838\u5fc3\u903b\u8f91&#xff09;<\/td>\n<td>30\u884c<\/td>\n<td>8\u884c<\/td>\n<td>-73%<\/td>\n<\/tr>\n<tr>\n<td>\u9519\u8bef\u4fe1\u606f\u8d28\u91cf<\/td>\n<td>Error: -2<\/td>\n<td>[email] \u90ae\u7bb1\u5df2\u88ab\u6ce8\u518c<\/td>\n<td>\u8d28\u7684\u98de\u8dc3<\/td>\n<\/tr>\n<tr>\n<td>\u9057\u6f0f\u9519\u8bef\u68c0\u67e5\u7684\u98ce\u9669<\/td>\n<td>\u9ad8&#xff08;\u7f16\u8bd1\u5668\u4e0d\u5f3a\u5236&#xff09;<\/td>\n<td>\u96f6&#xff08;\u7c7b\u578b\u7cfb\u7edf\u4fdd\u8bc1&#xff09;<\/td>\n<td>100%\u6d88\u9664<\/td>\n<\/tr>\n<tr>\n<td>\u94fe\u5f0f\u64cd\u4f5c\u7684\u53ef\u8bfb\u6027<\/td>\n<td>\u5d4c\u5957if\u91d1\u5b57\u5854<\/td>\n<td>\u7ebf\u6027\u7ba1\u9053<\/td>\n<td>\u663e\u8457\u63d0\u5347<\/td>\n<\/tr>\n<tr>\n<td>\u4e0e\u51fd\u6570\u5f0f\u8303\u5f0f\u7684\u4e00\u81f4\u6027<\/td>\n<td>\u65e0<\/td>\n<td>\u5b8c\u5168\u4e00\u81f4&#xff08;Monad&#xff09;<\/td>\n<td>\u65b0\u80fd\u529b<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h3>\u4e8c\u3001\u534f\u7a0b\u4f18\u5316\u5728 2026.1 \u7248\u672c\u4e2d\u7684\u6838\u5fc3\u652f\u6301\u89e3\u6790<\/h3>\n<h4>2.1 std::generator\u7684\u96f6\u6837\u677f\u4ee3\u7801\u4f53\u9a8c<\/h4>\n<p>\u5728C&#043;&#043;20\u65f6\u4ee3&#xff0c;\u5199\u4e00\u4e2a\u534f\u7a0b\u9700\u8981\u624b\u52a8\u5b9e\u73b0promise_type\u3001coroutine_handle\u7ba1\u7406\u3001\u8fed\u4ee3\u5668\u9002\u914d\u7b49\u5927\u91cf\u6837\u677f\u4ee3\u7801\u3002C&#043;&#043;23\u7684std::generator\u5f7b\u5e95\u6539\u53d8\u4e86\u8fd9\u4e00\u70b9&#xff1a;<\/p>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ C&#043;&#043;20\u65f6\u4ee3&#xff1a;\u624b\u5199\u751f\u6210\u5668&#xff08;\u7ea660\u884c\u6837\u677f\u4ee3\u7801&#xff09;<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/*<br \/>\ntemplate &lt;typename T&gt;<br \/>\nclass MyGenerator {<br \/>\npublic:<br \/>\n    struct promise_type {<br \/>\n        T current_value;<br \/>\n        std::suspend_always yield_value(T value) {<br \/>\n            current_value &#061; value;<br \/>\n            return {};<br \/>\n        }<br \/>\n        std::suspend_always initial_suspend() { return {}; }<br \/>\n        std::suspend_always final_suspend() noexcept { return {}; }<br \/>\n        MyGenerator get_return_object() {<br \/>\n            return MyGenerator{handle_type::from_promise(*this)};<br \/>\n        }<br \/>\n        void return_void() {}<br \/>\n        void unhandled_exception() { std::terminate(); }<br \/>\n    };<\/p>\n<p>    using handle_type &#061; std::coroutine_handle&lt;promise_type&gt;;<br \/>\n    handle_type handle_;<\/p>\n<p>    MyGenerator(handle_type h) : handle_(h) {}<br \/>\n    ~MyGenerator() { if (handle_) handle_.destroy(); }<\/p>\n<p>    struct iterator {<br \/>\n        handle_type handle_;<br \/>\n        bool operator!&#061;(const iterator&amp; other) const {<br \/>\n            return handle_.done() !&#061; other.handle_.done();<br \/>\n        }<br \/>\n        iterator&amp; operator&#043;&#043;() { handle_.resume(); return *this; }<br \/>\n        T&amp; operator*() const { return handle_.promise().current_value; }<br \/>\n    };<\/p>\n<p>    iterator begin() { handle_.resume(); return {handle_}; }<br \/>\n    iterator end() { return {nullptr}; }<br \/>\n};<br \/>\n*\/<\/span><\/p>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ C&#043;&#043;23&#xff1a;\u4e00\u884c\u641e\u5b9a&#xff08;\u96f6\u6837\u677f\u4ee3\u7801&#xff09;<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;generator&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;iostream&gt;<\/span><\/span><\/p>\n<p>std<span class=\"token double-colon punctuation\">::<\/span>generator<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token function\">countdown<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> from<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> i <span class=\"token operator\">&#061;<\/span> from<span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#8212;<\/span>i<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">co_yield<\/span> i<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u5c31\u8fd9\u4e00\u884c&#xff0c;\u5176\u4f59\u5168\u90e8\u7531std::generator\u5904\u7406<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u53d1\u5c04\u5012\u8ba1\u65f6: &#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> x <span class=\"token operator\">:<\/span> <span class=\"token function\">countdown<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">5<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> x <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; &#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;&#x1f680; \u53d1\u5c04&#xff01;&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u8f93\u51fa: \u53d1\u5c04\u5012\u8ba1\u65f6: 5 4 3 2 1 0 &#x1f680; \u53d1\u5c04&#xff01;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u6548\u679c\u51b2\u51fb&#xff1a; 60\u884c\u6837\u677f\u4ee3\u7801 \u2192 0\u884c\u3002std::generator\u5c06\u534f\u7a0b\u7684\u95e8\u69db\u4ece&#034;\u6a21\u677f\u5143\u7f16\u7a0b\u4e13\u5bb6&#034;\u964d\u4f4e\u5230&#034;\u4efb\u4f55\u4f1a\u5199for\u5faa\u73af\u7684\u5f00\u53d1\u8005&#034;\u3002<\/p>\n<h4>2.2 \u65e0\u9650\u5e8f\u5217\u7684\u60f0\u6027\u6c42\u503c\u6f14\u793a<\/h4>\n<h5>2.2.1 \u6590\u6ce2\u90a3\u5951\u6570\u5217&#xff1a;\u4ece\u9012\u5f52\u5230\u534f\u7a0b<\/h5>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u4e09\u79cd\u5b9e\u73b0\u65b9\u5f0f\u7684\u5bf9\u6bd4<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;generator&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;iostream&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;vector&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;functional&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;chrono&gt;<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u65b9\u5f0f1&#xff1a;\u4f20\u7edf\u9012\u5f52&#xff08;\u6709\u6808\u6ea2\u51fa\u98ce\u9669&#xff0c;\u91cd\u590d\u8ba1\u7b97&#xff09;<\/span><br \/>\n<span class=\"token keyword\">long<\/span> <span class=\"token keyword\">long<\/span> <span class=\"token function\">fib_recursive<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> n<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>n <span class=\"token operator\">&lt;&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span> n<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token function\">fib_recursive<\/span><span class=\"token punctuation\">(<\/span>n <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token function\">fib_recursive<\/span><span class=\"token punctuation\">(<\/span>n <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ fib(45)\u5c31\u9700\u8981\u7ea610\u79d2&#xff01;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u65b9\u5f0f2&#xff1a;\u9884\u8ba1\u7b97\u5230vector&#xff08;\u6d6a\u8d39\u5185\u5b58&#xff0c;\u5fc5\u987b\u63d0\u524d\u77e5\u9053\u9700\u8981\u591a\u5c11\u9879&#xff09;<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">long<\/span> <span class=\"token keyword\">long<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token function\">fib_vector<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> count<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">long<\/span> <span class=\"token keyword\">long<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token function\">result<\/span><span class=\"token punctuation\">(<\/span>count<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    result<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>count <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> result<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> count<span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        result<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> result<span class=\"token punctuation\">[<\/span>i<span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> result<span class=\"token punctuation\">[<\/span>i<span class=\"token operator\">&#8211;<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> result<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u65b9\u5f0f3&#xff1a;C&#043;&#043;23\u534f\u7a0b&#xff08;\u60f0\u6027\u3001\u65e0\u9650\u3001\u96f6\u989d\u5916\u5185\u5b58&#xff09;\u2605\u2605\u2605<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>generator<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">long<\/span> <span class=\"token keyword\">long<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token function\">fib_coroutine<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">long<\/span> <span class=\"token keyword\">long<\/span> a <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> b <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token boolean\">true<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>  <span class=\"token comment\">\/\/ \u65e0\u9650\u5e8f\u5217&#xff01;<\/span><br \/>\n        <span class=\"token keyword\">co_yield<\/span> a<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">auto<\/span> next <span class=\"token operator\">&#061;<\/span> a <span class=\"token operator\">&#043;<\/span> b<span class=\"token punctuation\">;<\/span><br \/>\n        a <span class=\"token operator\">&#061;<\/span> b<span class=\"token punctuation\">;<\/span><br \/>\n        b <span class=\"token operator\">&#061;<\/span> next<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6c38\u8fdc\u4e0d\u4f1a\u6267\u884c\u5230\u8fd9\u91cc&#xff0c;\u4f46\u6ca1\u5173\u7cfb<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u8c03\u7528\u8005\u968f\u65f6\u53ef\u4ee5\u505c\u6b62\u8fed\u4ee3&#xff0c;\u534f\u7a0b\u5e27\u81ea\u52a8\u9500\u6bc1<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;&#061;&#061;&#061; \u6590\u6ce2\u90a3\u5951\u6570\u5217&#xff1a;\u4e09\u79cd\u65b9\u5f0f\u5bf9\u6bd4 &#061;&#061;&#061;&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u534f\u7a0b\u65b9\u5f0f&#xff1a;\u53d6\u524d20\u9879<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\\\\n\u534f\u7a0b\u65b9\u5f0f&#xff08;\u524d20\u9879&#xff09;:&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> count <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">long<\/span> <span class=\"token keyword\">long<\/span> x <span class=\"token operator\">:<\/span> <span class=\"token function\">fib_coroutine<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> x <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; &#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">&#043;&#043;<\/span>count <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token number\">20<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u968f\u65f6\u505c\u6b62&#xff0c;\u65e0\u8d44\u6e90\u6cc4\u6f0f<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u534f\u7a0b\u65b9\u5f0f&#xff1a;\u627e\u5230\u7b2c\u4e00\u4e2a\u8d85\u8fc7100\u4e07\u7684\u6590\u6ce2\u90a3\u5951\u6570<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\\\\n\u7b2c\u4e00\u4e2a\u8d85\u8fc7100\u4e07\u7684\u6590\u6ce2\u90a3\u5951\u6570:&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">long<\/span> <span class=\"token keyword\">long<\/span> x <span class=\"token operator\">:<\/span> <span class=\"token function\">fib_coroutine<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">1&#039;000&#039;000<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> x <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u6027\u80fd\u5bf9\u6bd4<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\\\\n\u6027\u80fd\u5bf9\u6bd4&#xff08;\u8ba1\u7b97\u524d40\u9879&#xff09;:&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">auto<\/span> t1 <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>chrono<span class=\"token double-colon punctuation\">::<\/span>high_resolution_clock<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">now<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> vec <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">fib_vector<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">40<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> t2 <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>chrono<span class=\"token double-colon punctuation\">::<\/span>high_resolution_clock<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">now<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;  Vector\u65b9\u5f0f: &#034;<\/span><br \/>\n              <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>chrono<span class=\"token double-colon punctuation\">::<\/span><span class=\"token generic-function\"><span class=\"token function\">duration_cast<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>chrono<span class=\"token double-colon punctuation\">::<\/span>microseconds<span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>t2<span class=\"token operator\">&#8211;<\/span>t1<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">count<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n              <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; \u03bcs&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">auto<\/span> t3 <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>chrono<span class=\"token double-colon punctuation\">::<\/span>high_resolution_clock<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">now<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    count <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">long<\/span> <span class=\"token keyword\">long<\/span> x <span class=\"token operator\">:<\/span> <span class=\"token function\">fib_coroutine<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">&#043;&#043;<\/span>count <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token number\">40<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> t4 <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>chrono<span class=\"token double-colon punctuation\">::<\/span>high_resolution_clock<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">now<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;  \u534f\u7a0b\u65b9\u5f0f: &#034;<\/span><br \/>\n              <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>chrono<span class=\"token double-colon punctuation\">::<\/span><span class=\"token generic-function\"><span class=\"token function\">duration_cast<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>chrono<span class=\"token double-colon punctuation\">::<\/span>microseconds<span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>t4<span class=\"token operator\">&#8211;<\/span>t3<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">count<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n              <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; \u03bcs&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h5>2.2.2 \u7d20\u6570\u7b5b\u7684\u6d41\u5f0f\u5b9e\u73b0<\/h5>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;generator&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;iostream&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;vector&gt;<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u57c3\u62c9\u6258\u65af\u7279\u5c3c\u7b5b\u6cd5\u7684\u534f\u7a0b\u7248\u672c<\/span><br \/>\n<span class=\"token comment\">\/\/ \u6548\u679c&#xff1a;\u50cf&#034;\u6d41\u6c34\u7ebf&#034;\u4e00\u6837\u6e90\u6e90\u4e0d\u65ad\u5730\u4ea7\u51fa\u7d20\u6570<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>generator<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token function\">prime_sieve<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5148\u4ea7\u51fa2<\/span><br \/>\n    <span class=\"token keyword\">co_yield<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5df2\u77e5\u7d20\u6570\u5217\u8868&#xff08;\u7528\u4e8e\u8bd5\u9664&#xff09;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token operator\">&gt;<\/span> known_primes <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u4ece3\u5f00\u59cb&#xff0c;\u53ea\u68c0\u67e5\u5947\u6570<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> candidate <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">3<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">;<\/span> candidate <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">bool<\/span> is_prime <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u53ea\u7528\u5df2\u77e5\u7d20\u6570\u8bd5\u9664&#xff08;\u6bd4\u8bd5\u9664\u6240\u6709\u6570\u5feb\u5f97\u591a&#xff09;<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> p <span class=\"token operator\">:<\/span> known_primes<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>p <span class=\"token operator\">*<\/span> p <span class=\"token operator\">&gt;<\/span> candidate<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u53ea\u9700\u68c0\u67e5\u5230\u221acandidate<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>candidate <span class=\"token operator\">%<\/span> p <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                is_prime <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>is_prime<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            known_primes<span class=\"token punctuation\">.<\/span><span class=\"token function\">push_back<\/span><span class=\"token punctuation\">(<\/span>candidate<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">co_yield<\/span> candidate<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u4ea7\u51fa\u7d20\u6570&#xff0c;\u6682\u505c\u7b49\u5f85\u4e0b\u4e00\u6b21\u8bf7\u6c42<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u524d25\u4e2a\u7d20\u6570: &#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> count <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> p <span class=\"token operator\">:<\/span> <span class=\"token function\">prime_sieve<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> p <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; &#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">&#043;&#043;<\/span>count <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token number\">25<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u627e\u5230\u7b2c100\u4e2a\u7d20\u6570<\/span><br \/>\n    count <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> hundredth <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> p <span class=\"token operator\">:<\/span> <span class=\"token function\">prime_sieve<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">&#043;&#043;<\/span>count <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            hundredth <span class=\"token operator\">&#061;<\/span> p<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u7b2c100\u4e2a\u7d20\u6570: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> hundredth <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ 541<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h5>2.2.3 \u4e0ePython\u751f\u6210\u5668\u7684\u8bed\u6cd5\u5bf9\u6bd4<\/h5>\n<p><span class=\"token comment\"># Python\u7248\u672c<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">fibonacci<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    a<span class=\"token punctuation\">,<\/span> b <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token boolean\">True<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">yield<\/span> a<br \/>\n        a<span class=\"token punctuation\">,<\/span> b <span class=\"token operator\">&#061;<\/span> b<span class=\"token punctuation\">,<\/span> a <span class=\"token operator\">&#043;<\/span> b<\/p>\n<p><span class=\"token keyword\">for<\/span> x <span class=\"token keyword\">in<\/span> fibonacci<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> x <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">1000<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">break<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">,<\/span> end<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#039; &#039;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\">\/\/ C&#043;&#043;23\u7248\u672c&#xff08;\u51e0\u4e4e\u4e00\u4e00\u5bf9\u5e94&#xff01;&#xff09;<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>generator<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">long<\/span> <span class=\"token keyword\">long<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token function\">fibonacci<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">long<\/span> <span class=\"token keyword\">long<\/span> a <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> b <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token boolean\">true<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">co_yield<\/span> a<span class=\"token punctuation\">;<\/span>       <span class=\"token comment\">\/\/ \u5bf9\u5e94Python\u7684 yield a<\/span><br \/>\n        <span class=\"token keyword\">auto<\/span> next <span class=\"token operator\">&#061;<\/span> a <span class=\"token operator\">&#043;<\/span> b<span class=\"token punctuation\">;<\/span><br \/>\n        a <span class=\"token operator\">&#061;<\/span> b<span class=\"token punctuation\">;<\/span><br \/>\n        b <span class=\"token operator\">&#061;<\/span> next<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u4f7f\u7528<\/span><br \/>\n<span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">long<\/span> <span class=\"token keyword\">long<\/span> x <span class=\"token operator\">:<\/span> <span class=\"token function\">fibonacci<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">1000<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> x <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; &#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u6548\u679c&#xff1a; C&#043;&#043;23\u534f\u7a0b\u7684\u8bed\u6cd5\u5df2\u7ecf\u4e0ePython\u751f\u6210\u5668\u9ad8\u5ea6\u5bf9\u9f50&#xff0c;\u5bf9\u4e8e\u6709Python\u7ecf\u9a8c\u7684\u5f00\u53d1\u8005\u51e0\u4e4e\u96f6\u5b66\u4e60\u6210\u672c\u3002<\/p>\n<h4>2.3 \u534f\u7a0b\u4e0eRanges\u7684\u878d\u5408\u6548\u679c<\/h4>\n<h5>2.3.1 \u7ba1\u9053\u5f0f\u6570\u636e\u53d8\u6362<\/h5>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u534f\u7a0b &#043; Ranges &#061; \u58f0\u660e\u5f0f\u6570\u636e\u7ba1\u9053<\/span><br \/>\n<span class=\"token comment\">\/\/ \u6548\u679c&#xff1a;\u50cf\u5199SQL\u4e00\u6837\u5199C&#043;&#043;\u6570\u636e\u5904\u7406<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;generator&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;ranges&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;iostream&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;algorithm&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;cmath&gt;<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6570\u636e\u6e90&#xff1a;\u6a21\u62df\u4f20\u611f\u5668\u8bfb\u6570&#xff08;\u65e0\u9650\u6d41&#xff09;<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>generator<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">double<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token function\">sensor_readings<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6a21\u62df\u4e00\u4e2a\u5e26\u566a\u58f0\u7684\u6b63\u5f26\u6ce2\u4f20\u611f\u5668<\/span><br \/>\n    <span class=\"token keyword\">double<\/span> t <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">unsigned<\/span> seed <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">42<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token boolean\">true<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u7b80\u5355\u4f2a\u968f\u673a\u566a\u58f0<\/span><br \/>\n        seed <span class=\"token operator\">&#061;<\/span> seed <span class=\"token operator\">*<\/span> <span class=\"token number\">1103515245<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">12345<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">double<\/span> noise <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token generic-function\"><span class=\"token function\">static_cast<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">double<\/span><span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>seed <span class=\"token operator\">%<\/span> <span class=\"token number\">1000<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">1000.0<\/span> <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">0.5<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">0.2<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">double<\/span> signal <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">sin<\/span><span class=\"token punctuation\">(<\/span>t <span class=\"token operator\">*<\/span> <span class=\"token number\">0.1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">10.0<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">50.0<\/span> <span class=\"token operator\">&#043;<\/span> noise<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">co_yield<\/span> signal<span class=\"token punctuation\">;<\/span><br \/>\n        t <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token number\">1.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;&#061;&#061;&#061; \u4f20\u611f\u5668\u6570\u636e\u5904\u7406\u7ba1\u9053 &#061;&#061;&#061;&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u539f\u59cb \u2192 \u8fc7\u6ee4\u5f02\u5e38 \u2192 \u5e73\u6ed1 \u2192 \u53d6\u524d10\u4e2a \u2192 \u683c\u5f0f\u5316\u8f93\u51fa&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">string<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">50<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token char\">&#039;-&#039;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u2605\u2605\u2605 \u58f0\u660e\u5f0f\u7ba1\u9053&#xff1a;\u4e00\u884c\u4ee3\u7801\u63cf\u8ff0\u5b8c\u6574\u7684\u6570\u636e\u6d41 \u2605\u2605\u2605<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> processed <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">sensor_readings<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token operator\">|<\/span> std<span class=\"token double-colon punctuation\">::<\/span>views<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">filter<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">double<\/span> x<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>           <span class=\"token comment\">\/\/ \u6b65\u9aa41&#xff1a;\u8fc7\u6ee4\u5f02\u5e38\u503c<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> x <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">30.0<\/span> <span class=\"token operator\">&amp;&amp;<\/span> x <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">70.0<\/span><span class=\"token punctuation\">;<\/span>              <span class=\"token comment\">\/\/ \u53ea\u4fdd\u7559\u5408\u7406\u8303\u56f4<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token operator\">|<\/span> std<span class=\"token double-colon punctuation\">::<\/span>views<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">transform<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">double<\/span> x<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>        <span class=\"token comment\">\/\/ \u6b65\u9aa42&#xff1a;\u5f52\u4e00\u5316\u52300-1<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">30.0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">40.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token operator\">|<\/span> std<span class=\"token double-colon punctuation\">::<\/span>views<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">take<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>                       <span class=\"token comment\">\/\/ \u6b65\u9aa43&#xff1a;\u53ea\u53d6\u524d10\u4e2a<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u6d88\u8d39\u7ba1\u9053<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> idx <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">double<\/span> value <span class=\"token operator\">:<\/span> processed<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u7b80\u5355\u7684\u6587\u672c\u67f1\u72b6\u56fe<\/span><br \/>\n        <span class=\"token keyword\">int<\/span> bar_len <span class=\"token operator\">&#061;<\/span> <span class=\"token generic-function\"><span class=\"token function\">static_cast<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>value <span class=\"token operator\">*<\/span> <span class=\"token number\">40<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">format<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[{:2d}] {:5.3f} |{}&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            idx<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">,<\/span> value<span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">string<\/span><span class=\"token punctuation\">(<\/span>bar_len<span class=\"token punctuation\">,<\/span> <span class=\"token char\">&#039;\u2588&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u8fd0\u884c\u6548\u679c&#xff1a;<\/p>\n<p>&#061;&#061;&#061; \u4f20\u611f\u5668\u6570\u636e\u5904\u7406\u7ba1\u9053 &#061;&#061;&#061;<br \/>\n\u539f\u59cb \u2192 \u8fc7\u6ee4\u5f02\u5e38 \u2192 \u5e73\u6ed1 \u2192 \u53d6\u524d10\u4e2a \u2192 \u683c\u5f0f\u5316\u8f93\u51fa<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n[ 0] 0.512 |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588<br \/>\n[ 1] 0.538 |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588<br \/>\n[ 2] 0.497 |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588<br \/>\n[ 3] 0.461 |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588<br \/>\n[ 4] 0.423 |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588<br \/>\n[ 5] 0.389 |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588<br \/>\n[ 6] 0.358 |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588<br \/>\n[ 7] 0.334 |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588<br \/>\n[ 8] 0.321 |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588<br \/>\n[ 9] 0.319 |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588<\/p>\n<h4>2.4 \u81ea\u5b9a\u4e49\u534f\u7a0b\u7c7b\u578b\u7684IDE\u652f\u6301<\/h4>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u5728CLion 2026.1\u4e2d\u7f16\u5199\u81ea\u5b9a\u4e49\u534f\u7a0b\u7c7b\u578b\u7684\u4f53\u9a8c<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;coroutine&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;iostream&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;optional&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;exception&gt;<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u81ea\u5b9a\u4e49Task\u7c7b\u578b<\/span><br \/>\n<span class=\"token keyword\">template<\/span> <span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">typename<\/span> <span class=\"token class-name\">T<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">Task<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">promise_type<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>optional<span class=\"token operator\">&lt;<\/span>T<span class=\"token operator\">&gt;<\/span> value_<span class=\"token punctuation\">;<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>exception_ptr error_<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ CLion Nova\u8865\u5168\u4f53\u9a8c&#xff1a;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8f93\u5165 &#034;get_ret&#034; \u540e\u6309Tab \u2192 \u81ea\u52a8\u8865\u5168 get_return_object()<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8f93\u5165 &#034;initial_s&#034; \u2192 \u81ea\u52a8\u8865\u5168 initial_suspend()<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8f93\u5165 &#034;final_s&#034; \u2192 \u81ea\u52a8\u8865\u5168 final_suspend()<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8f93\u5165 &#034;unhandled&#034; \u2192 \u81ea\u52a8\u8865\u5168 unhandled_exception()<\/span><\/p>\n<p>        Task <span class=\"token function\">get_return_object<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> Task<span class=\"token punctuation\">{<\/span>std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token class-name\">coroutine_handle<\/span><span class=\"token operator\">&lt;<\/span>promise_type<span class=\"token operator\">&gt;<\/span><span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">from_promise<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span><span class=\"token keyword\">this<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>suspend_never <span class=\"token function\">initial_suspend<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">noexcept<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>suspend_always <span class=\"token function\">final_suspend<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">noexcept<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">void<\/span> <span class=\"token function\">return_value<\/span><span class=\"token punctuation\">(<\/span>T v<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> value_ <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">move<\/span><span class=\"token punctuation\">(<\/span>v<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">void<\/span> <span class=\"token function\">unhandled_exception<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> error_ <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">current_exception<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    std<span class=\"token double-colon punctuation\">::<\/span>coroutine_handle<span class=\"token operator\">&lt;<\/span>promise_type<span class=\"token operator\">&gt;<\/span> h_<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">explicit<\/span> <span class=\"token function\">Task<\/span><span class=\"token punctuation\">(<\/span>std<span class=\"token double-colon punctuation\">::<\/span>coroutine_handle<span class=\"token operator\">&lt;<\/span>promise_type<span class=\"token operator\">&gt;<\/span> h<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">:<\/span> <span class=\"token function\">h_<\/span><span class=\"token punctuation\">(<\/span>h<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token function\">Task<\/span><span class=\"token punctuation\">(<\/span>Task<span class=\"token operator\">&amp;&amp;<\/span> o<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">noexcept<\/span> <span class=\"token operator\">:<\/span> <span class=\"token function\">h_<\/span><span class=\"token punctuation\">(<\/span>o<span class=\"token punctuation\">.<\/span>h_<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> o<span class=\"token punctuation\">.<\/span>h_ <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token operator\">~<\/span><span class=\"token function\">Task<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>h_<span class=\"token punctuation\">)<\/span> h_<span class=\"token punctuation\">.<\/span><span class=\"token function\">destroy<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><\/p>\n<p>    T <span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>h_<span class=\"token punctuation\">.<\/span><span class=\"token function\">promise<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>error_<span class=\"token punctuation\">)<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">rethrow_exception<\/span><span class=\"token punctuation\">(<\/span>h_<span class=\"token punctuation\">.<\/span><span class=\"token function\">promise<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>error_<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">move<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>h_<span class=\"token punctuation\">.<\/span><span class=\"token function\">promise<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>value_<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ CLion\u4e2d\u7684\u7f16\u5199\u4f53\u9a8c&#xff1a;<\/span><br \/>\n<span class=\"token comment\">\/\/ 1. \u8f93\u5165 &#034;Task&lt;int&gt; compute() {&#034; \u540e\u56de\u8f66<\/span><br \/>\n<span class=\"token comment\">\/\/ 2. \u8f93\u5165 &#034;co_return&#034; \u2192 CLion\u7acb\u5373\u8bc6\u522b\u8fd9\u662f\u534f\u7a0b<\/span><br \/>\n<span class=\"token comment\">\/\/ 3. \u4ee3\u7801\u9ad8\u4eae&#xff1a;co_return \u663e\u793a\u4e3a\u7d2b\u8272&#xff08;\u5173\u952e\u5b57\u989c\u8272&#xff09;<\/span><br \/>\n<span class=\"token comment\">\/\/ 4. \u5982\u679c\u5fd8\u8bb0\u5199co_return&#xff0c;CLion\u4f1a\u663e\u793a\u8b66\u544a&#xff1a;<\/span><br \/>\n<span class=\"token comment\">\/\/    &#034;Coroutine function must contain at least one co_await, co_yield, or co_return&#034;<\/span><\/p>\n<p>Task<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token function\">compute_answer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">co_return<\/span> <span class=\"token number\">42<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>Task<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">greet<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> name<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">co_return<\/span> <span class=\"token string\">&#034;Hello, &#034;<\/span> <span class=\"token operator\">&#043;<\/span> name <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#034;!&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> t1 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">compute_answer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> t1<span class=\"token punctuation\">.<\/span><span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ 42<\/span><\/p>\n<p>    <span class=\"token keyword\">auto<\/span> t2 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">greet<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;C&#043;&#043;23&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> t2<span class=\"token punctuation\">.<\/span><span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ Hello, C&#043;&#043;23!<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>2.5 \u6548\u679c\u4eae\u70b9\u603b\u7ed3<\/h4>\n<table>\n<tr>\u7ef4\u5ea6C&#043;&#043;20\u534f\u7a0bC&#043;&#043;23 std::generator\u63d0\u5347<\/tr>\n<tbody>\n<tr>\n<td>\u6837\u677f\u4ee3\u7801\u91cf<\/td>\n<td>~60\u884c<\/td>\n<td>0\u884c<\/td>\n<td>100%\u6d88\u9664<\/td>\n<\/tr>\n<tr>\n<td>\u5b66\u4e60\u95e8\u69db<\/td>\n<td>\u6a21\u677f\u5143\u7f16\u7a0b\u4e13\u5bb6<\/td>\n<td>\u4f1a\u5199for\u5faa\u73af\u5373\u53ef<\/td>\n<td>\u5927\u5e45\u964d\u4f4e<\/td>\n<\/tr>\n<tr>\n<td>\u4e0ePython\u751f\u6210\u5668\u7684\u76f8\u4f3c\u5ea6<\/td>\n<td>\u4f4e<\/td>\n<td>~90%<\/td>\n<td>\u8d28\u7684\u98de\u8dc3<\/td>\n<\/tr>\n<tr>\n<td>Ranges\u96c6\u6210<\/td>\n<td>\u9700\u624b\u52a8\u9002\u914d<\/td>\n<td>\u5f00\u7bb1\u5373\u7528<\/td>\n<td>\u65b0\u80fd\u529b<\/td>\n<\/tr>\n<tr>\n<td>CLion\u8865\u5168\u652f\u6301<\/td>\n<td>\u57fa\u7840<\/td>\n<td>\u5b8c\u6574&#xff08;Nova\u5f15\u64ce&#xff09;<\/td>\n<td>\u663e\u8457\u63d0\u5347<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h3>\u4e09\u3001\u771f\u5b9e\u9879\u76ee\u573a\u666f\u4e0b\u7684\u8fc1\u79fb\u9002\u914d\u6d41\u7a0b\u590d\u76d8<\/h3>\n<h4>3.1 \u9879\u76ee\u80cc\u666f&#xff1a;\u4e00\u4e2a10\u4e07\u884c\u7684\u7f51\u7edc\u670d\u52a1\u6846\u67b6<\/h4>\n<p>\u9879\u76ee\u6982\u51b5&#xff1a;<br \/>\n&#8211; \u4ee3\u7801\u91cf&#xff1a;\u7ea6102,000\u884cC&#043;&#043;\u4ee3\u7801<br \/>\n&#8211; \u6a21\u5757\u6570&#xff1a;23\u4e2a\u6838\u5fc3\u6a21\u5757<br \/>\n&#8211; \u56e2\u961f\u89c4\u6a21&#xff1a;8\u4eba<br \/>\n&#8211; \u539f\u6709\u9519\u8bef\u5904\u7406&#xff1a;\u9519\u8bef\u7801(60%) &#043; \u5f02\u5e38(30%) &#043; optional(10%) \u6df7\u5408<br \/>\n&#8211; \u539f\u6709\u5f02\u6b65\u6a21\u578b&#xff1a;\u56de\u8c03 &#043; std::future \u6df7\u5408<br \/>\n&#8211; \u7f16\u8bd1\u5668&#xff1a;GCC 12&#xff08;\u8fc1\u79fb\u524d&#xff09;\u2192 GCC 15&#xff08;\u8fc1\u79fb\u540e&#xff09;<br \/>\n&#8211; IDE&#xff1a;CLion 2024.3 \u2192 CLion 2026.1<\/p>\n<h4>3.2 \u8fc1\u79fb\u524d\u7684\u4ee3\u7801&#034;\u707e\u96be\u73b0\u573a&#034;<\/h4>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u8fc1\u79fb\u524d&#xff1a;\u4e00\u4e2a\u5178\u578b\u7684&#034;\u707e\u96be&#034;\u51fd\u6570<\/span><br \/>\n<span class=\"token comment\">\/\/ \u95ee\u9898&#xff1a;\u9519\u8bef\u7801&#043;\u5f02\u5e38&#043;\u8f93\u51fa\u53c2\u6570&#043;\u56de\u8c03&#xff0c;\u56db\u79cd\u98ce\u683c\u6df7\u5728\u4e00\u8d77<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u9519\u8bef\u7801\u5b9a\u4e49&#xff08;\u6563\u843d\u57285\u4e2a\u4e0d\u540c\u7684\u5934\u6587\u4ef6\u4e2d&#xff09;<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NET_OK<\/span>          <span class=\"token expression\"><span class=\"token number\">0<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NET_ERR_DNS<\/span>    <span class=\"token expression\"><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NET_ERR_CONN<\/span>   <span class=\"token expression\"><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">2<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NET_ERR_TIMEOUT<\/span> <span class=\"token expression\"><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">3<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NET_ERR_SSL<\/span>    <span class=\"token expression\"><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">4<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NET_ERR_HTTP<\/span>   <span class=\"token expression\"><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">5<\/span><\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u56de\u8c03\u7c7b\u578b&#xff08;6\u79cd\u4e0d\u540c\u7684\u56de\u8c03\u7b7e\u540d&#xff01;&#xff09;<\/span><br \/>\n<span class=\"token keyword\">using<\/span> ConnectCallback <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>function<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> err<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">)<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">using<\/span> ReadCallback <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>function<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> err<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span> data<span class=\"token punctuation\">,<\/span> size_t len<span class=\"token punctuation\">)<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">using<\/span> WriteCallback <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>function<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> err<span class=\"token punctuation\">,<\/span> size_t written<span class=\"token punctuation\">)<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">HttpClient<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u95ee\u98981&#xff1a;\u9519\u8bef\u7801&#043;\u8f93\u51fa\u53c2\u6570<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> <span class=\"token function\">connect<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> host<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> port<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span><span class=\"token operator\">&amp;<\/span> out_fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u95ee\u98982&#xff1a;\u5f02\u5e38&#xff08;\u4e0e\u9519\u8bef\u7801\u4e0d\u4e00\u81f4&#xff01;&#xff09;<\/span><br \/>\n    <span class=\"token keyword\">void<\/span> <span class=\"token function\">send_request<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> Request<span class=\"token operator\">&amp;<\/span> req<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u5931\u8d25\u65f6\u629b\u5f02\u5e38<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u95ee\u98983&#xff1a;\u56de\u8c03\u5730\u72f1<\/span><br \/>\n    <span class=\"token keyword\">void<\/span> <span class=\"token function\">async_get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> url<span class=\"token punctuation\">,<\/span><br \/>\n                   ConnectCallback on_connect<span class=\"token punctuation\">,<\/span><br \/>\n                   ReadCallback on_read<span class=\"token punctuation\">,<\/span><br \/>\n                   std<span class=\"token double-colon punctuation\">::<\/span>function<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&gt;<\/span> on_error<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u53c8\u4e00\u4e2a\u4e0d\u540c\u7684\u7b7e\u540d<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u95ee\u98984&#xff1a;bool&#043;\u8f93\u51fa\u53c2\u6570<\/span><br \/>\n    <span class=\"token keyword\">bool<\/span> <span class=\"token function\">parse_response<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> raw<span class=\"token punctuation\">,<\/span> Response<span class=\"token operator\">&amp;<\/span> out<span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> err_msg<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u8c03\u7528\u8005\u7684\u5669\u68a6&#xff1a;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">fetch_data_legacy<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> err <span class=\"token operator\">&#061;<\/span> client<span class=\"token punctuation\">.<\/span><span class=\"token function\">connect<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;api.example.com&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">443<\/span><span class=\"token punctuation\">,<\/span> fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>err <span class=\"token operator\">!&#061;<\/span> NET_OK<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">log_error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;connect failed: %d&#034;<\/span><span class=\"token punctuation\">,<\/span> err<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ -2\u662f\u4ec0\u4e48\u610f\u601d&#xff1f;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">try<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        client<span class=\"token punctuation\">.<\/span><span class=\"token function\">send_request<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">build_request<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">catch<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>exception<span class=\"token operator\">&amp;<\/span> e<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">log_error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;send failed: %s&#034;<\/span><span class=\"token punctuation\">,<\/span> e<span class=\"token punctuation\">.<\/span><span class=\"token function\">what<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u56de\u8c03\u5730\u72f1\u5f00\u59cb&#8230;<\/span><br \/>\n    client<span class=\"token punctuation\">.<\/span><span class=\"token function\">async_get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\/data&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> err<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>err<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token comment\">\/* \u5904\u7406\u8fde\u63a5\u9519\u8bef *\/<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u5d4c\u5957\u56de\u8c03&#8230;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> err<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span> data<span class=\"token punctuation\">,<\/span> size_t len<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>err<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token comment\">\/* \u5904\u7406\u8bfb\u53d6\u9519\u8bef *\/<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u66f4\u591a\u5d4c\u5957&#8230;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> err<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u8fd9\u4e2a\u56de\u8c03\u4ec0\u4e48\u65f6\u5019\u88ab\u8c03\u7528&#xff1f;\u6587\u6863\u4e0d\u6e05\u695a&#8230;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>3.3 \u4e09\u9636\u6bb5\u8fc1\u79fb\u7684\u5b8c\u6574\u590d\u76d8<\/h4>\n<h5>3.3.1 \u7b2c\u4e00\u9636\u6bb5&#xff1a;\u9519\u8bef\u7c7b\u578b\u7edf\u4e00&#xff08;\u8017\u65f62\u5929&#xff09;<\/h5>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u8fc1\u79fb\u7b2c\u4e00\u6b65&#xff1a;\u5b9a\u4e49\u7edf\u4e00\u7684\u9519\u8bef\u7c7b\u578b<\/span><br \/>\n<span class=\"token comment\">\/\/ \u6587\u4ef6&#xff1a;include\/net\/error.h<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">pragma<\/span> <span class=\"token expression\">once<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;expected&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;format&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;system_error&gt;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">namespace<\/span> net <span class=\"token punctuation\">{<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u7edf\u4e00\u9519\u8bef\u7c7b\u578b&#xff08;\u66ff\u4ee3\u6563\u843d\u7684#define\u548cenum&#xff09;<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">Error<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">enum<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Code<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u7f51\u7edc\u5c42<\/span><br \/>\n        DnsResolution<span class=\"token punctuation\">,<\/span><br \/>\n        ConnectionRefused<span class=\"token punctuation\">,<\/span><br \/>\n        ConnectionReset<span class=\"token punctuation\">,<\/span><br \/>\n        Timeout<span class=\"token punctuation\">,<\/span><br \/>\n        SslHandshake<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u534f\u8bae\u5c42<\/span><br \/>\n        InvalidUrl<span class=\"token punctuation\">,<\/span><br \/>\n        HttpStatusError<span class=\"token punctuation\">,<\/span><br \/>\n        ParseError<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u7cfb\u7edf\u5c42<\/span><br \/>\n        IoError<span class=\"token punctuation\">,<\/span><br \/>\n        OutOfMemory<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    Code code<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string message<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string context<span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/\/ \u51fa\u9519\u65f6\u7684\u4e0a\u4e0b\u6587&#xff08;URL\u3001\u51fd\u6570\u540d\u7b49&#xff09;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> sys_errno <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span>      <span class=\"token comment\">\/\/ \u4fdd\u7559\u539f\u59cberrno&#xff08;\u8c03\u8bd5\u7528&#xff09;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u662f\u5426\u53ef\u91cd\u8bd5<\/span><br \/>\n    <span class=\"token keyword\">bool<\/span> <span class=\"token function\">retryable<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> code <span class=\"token operator\">&#061;&#061;<\/span> Code<span class=\"token double-colon punctuation\">::<\/span>Timeout <span class=\"token operator\">||<\/span><br \/>\n               code <span class=\"token operator\">&#061;&#061;<\/span> Code<span class=\"token double-colon punctuation\">::<\/span>ConnectionRefused <span class=\"token operator\">||<\/span><br \/>\n               code <span class=\"token operator\">&#061;&#061;<\/span> Code<span class=\"token double-colon punctuation\">::<\/span>ConnectionReset<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u683c\u5f0f\u5316\u8f93\u51fa<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string <span class=\"token function\">str<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">auto<\/span> base <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">format<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[{}] {}&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">to_string<\/span><span class=\"token punctuation\">(<\/span>code<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> message<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>context<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> base <span class=\"token operator\">&#043;&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">format<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034; (\u4e0a\u4e0b\u6587: {})&#034;<\/span><span class=\"token punctuation\">,<\/span> context<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> base<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">static<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span> <span class=\"token function\">to_string<\/span><span class=\"token punctuation\">(<\/span>Code c<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">switch<\/span> <span class=\"token punctuation\">(<\/span>c<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">case<\/span> Code<span class=\"token double-colon punctuation\">::<\/span>DnsResolution<span class=\"token operator\">:<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token string\">&#034;DNS\u89e3\u6790&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">case<\/span> Code<span class=\"token double-colon punctuation\">::<\/span>ConnectionRefused<span class=\"token operator\">:<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token string\">&#034;\u8fde\u63a5\u62d2\u7edd&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">case<\/span> Code<span class=\"token double-colon punctuation\">::<\/span>ConnectionReset<span class=\"token operator\">:<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token string\">&#034;\u8fde\u63a5\u91cd\u7f6e&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">case<\/span> Code<span class=\"token double-colon punctuation\">::<\/span>Timeout<span class=\"token operator\">:<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token string\">&#034;\u8d85\u65f6&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">case<\/span> Code<span class=\"token double-colon punctuation\">::<\/span>SslHandshake<span class=\"token operator\">:<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token string\">&#034;SSL\u63e1\u624b&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">case<\/span> Code<span class=\"token double-colon punctuation\">::<\/span>InvalidUrl<span class=\"token operator\">:<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token string\">&#034;URL\u65e0\u6548&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">case<\/span> Code<span class=\"token double-colon punctuation\">::<\/span>HttpStatusError<span class=\"token operator\">:<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token string\">&#034;HTTP\u9519\u8bef&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">case<\/span> Code<span class=\"token double-colon punctuation\">::<\/span>ParseError<span class=\"token operator\">:<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token string\">&#034;\u89e3\u6790\u9519\u8bef&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">case<\/span> Code<span class=\"token double-colon punctuation\">::<\/span>IoError<span class=\"token operator\">:<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token string\">&#034;IO\u9519\u8bef&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">case<\/span> Code<span class=\"token double-colon punctuation\">::<\/span>OutOfMemory<span class=\"token operator\">:<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token string\">&#034;\u5185\u5b58\u4e0d\u8db3&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token string\">&#034;\u672a\u77e5&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u4eceerrno\u6784\u9020<\/span><br \/>\n    <span class=\"token keyword\">static<\/span> Error <span class=\"token function\">from_errno<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> err<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> ctx<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> Error<span class=\"token punctuation\">{<\/span>Code<span class=\"token double-colon punctuation\">::<\/span>IoError<span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">strerror<\/span><span class=\"token punctuation\">(<\/span>err<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> ctx<span class=\"token punctuation\">,<\/span> err<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u7edf\u4e00\u7684\u7ed3\u679c\u7c7b\u578b<\/span><br \/>\n<span class=\"token keyword\">template<\/span> <span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">typename<\/span> <span class=\"token class-name\">T<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n<span class=\"token keyword\">using<\/span> Result <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span>T<span class=\"token punctuation\">,<\/span> Error<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u4fbf\u6377\u5b8f&#xff1a;\u5feb\u901f\u6784\u9020\u9519\u8bef<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">NET_ERROR<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span>code<span class=\"token punctuation\">,<\/span> msg<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">)<\/span> <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token expression\">std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>net<span class=\"token double-colon punctuation\">::<\/span>Error<span class=\"token punctuation\">{<\/span>net<span class=\"token double-colon punctuation\">::<\/span>Error<span class=\"token double-colon punctuation\">::<\/span>Code<span class=\"token double-colon punctuation\">::<\/span>code<span class=\"token punctuation\">,<\/span> <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n        <span class=\"token expression\">std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">format<\/span><span class=\"token punctuation\">(<\/span>msg <span class=\"token function\">__VA_OPT__<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">,<\/span><span class=\"token punctuation\">)<\/span> __VA_ARGS__<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token constant\">__func__<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p><span class=\"token punctuation\">}<\/span> <span class=\"token comment\">\/\/ namespace net<\/span><\/p>\n<h5>3.3.2 \u7b2c\u4e8c\u9636\u6bb5&#xff1a;\u6838\u5fc3\u6a21\u5757\u91cd\u6784&#xff08;\u8017\u65f65\u5929&#xff09;<\/h5>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u8fc1\u79fb\u540e&#xff1a;\u7edf\u4e00\u7684\u540c\u6b65\u63a5\u53e3<\/span><br \/>\n<span class=\"token comment\">\/\/ \u6587\u4ef6&#xff1a;include\/net\/http_client.h<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">pragma<\/span> <span class=\"token expression\">once<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;net\/error.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;map&gt;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">namespace<\/span> net <span class=\"token punctuation\">{<\/span><\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">Request<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string method <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;GET&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string url<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>map<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> headers<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string body<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> timeout_ms <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">30000<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">Response<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> status_code<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string body<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>map<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> headers<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">HttpClient<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u65e7&#xff1a;int connect(host, port, out_fd)<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u65b0&#xff1a;Result&lt;void&gt; connect(host, port)<\/span><br \/>\n    Result<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">void<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token function\">connect<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> host<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> port<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u65e7&#xff1a;void send_request(req) \u629b\u5f02\u5e38<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u65b0&#xff1a;Result&lt;Response&gt; send(req) \u8fd4\u56deexpected<\/span><br \/>\n    Result<span class=\"token operator\">&lt;<\/span>Response<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">send<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> Request<span class=\"token operator\">&amp;<\/span> req<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u65e7&#xff1a;bool parse_response(raw, out, err_msg)<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u65b0&#xff1a;Result&lt;Response&gt; parse(raw)<\/span><br \/>\n    Result<span class=\"token operator\">&lt;<\/span>Response<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">parse<\/span><span class=\"token punctuation\">(<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string_view raw<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u4fbf\u6377\u65b9\u6cd5&#xff1a;\u4e00\u6b65\u5b8c\u6210<\/span><br \/>\n    Result<span class=\"token operator\">&lt;<\/span>Response<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> url<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    Result<span class=\"token operator\">&lt;<\/span>Response<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">post<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> url<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> body<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token punctuation\">}<\/span> <span class=\"token comment\">\/\/ namespace net<\/span><\/p>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u8fc1\u79fb\u540e&#xff1a;\u5b9e\u73b0\u6587\u4ef6<\/span><br \/>\n<span class=\"token comment\">\/\/ \u6587\u4ef6&#xff1a;src\/net\/http_client.cpp<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;net\/http_client.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;regex&gt;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">namespace<\/span> net <span class=\"token punctuation\">{<\/span><\/p>\n<p>Result<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">void<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token class-name\">HttpClient<\/span><span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">connect<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> host<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> port<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ DNS\u89e3\u6790<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>host<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token function\">NET_ERROR<\/span><span class=\"token punctuation\">(<\/span>InvalidUrl<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u4e3b\u673a\u540d\u4e3a\u7a7a&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u6a21\u62dfDNS\u89e3\u6790\u5931\u8d25<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>host <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;invalid.host&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token function\">NET_ERROR<\/span><span class=\"token punctuation\">(<\/span>DnsResolution<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u65e0\u6cd5\u89e3\u6790\u4e3b\u673a: {}&#034;<\/span><span class=\"token punctuation\">,<\/span> host<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u6a21\u62df\u8fde\u63a5<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>port <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token function\">NET_ERROR<\/span><span class=\"token punctuation\">(<\/span>ConnectionRefused<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u7aef\u53e3\u65e0\u6548: {}&#034;<\/span><span class=\"token punctuation\">,<\/span> port<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u8fde\u63a5\u6210\u529f<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>Result<span class=\"token operator\">&lt;<\/span>Response<span class=\"token operator\">&gt;<\/span> <span class=\"token class-name\">HttpClient<\/span><span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">send<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> Request<span class=\"token operator\">&amp;<\/span> req<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5148\u8fde\u63a5<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> conn <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">connect<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">extract_host<\/span><span class=\"token punctuation\">(<\/span>req<span class=\"token punctuation\">.<\/span>url<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">extract_port<\/span><span class=\"token punctuation\">(<\/span>req<span class=\"token punctuation\">.<\/span>url<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>conn<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>conn<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u6a21\u62dfHTTP\u8bf7\u6c42<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>req<span class=\"token punctuation\">.<\/span>url<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\/slow&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token double-colon punctuation\">::<\/span>npos<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token function\">NET_ERROR<\/span><span class=\"token punctuation\">(<\/span>Timeout<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u8bf7\u6c42\u8d85\u65f6({}ms)&#034;<\/span><span class=\"token punctuation\">,<\/span> req<span class=\"token punctuation\">.<\/span>timeout_ms<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    Response resp<span class=\"token punctuation\">;<\/span><br \/>\n    resp<span class=\"token punctuation\">.<\/span>status_code <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">200<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    resp<span class=\"token punctuation\">.<\/span>body <span class=\"token operator\">&#061;<\/span> <span class=\"token raw-string string\">R&#034;({&#034;ok&#034;:true})&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    resp<span class=\"token punctuation\">.<\/span>headers<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;Content-Type&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;application\/json&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> resp<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>Result<span class=\"token operator\">&lt;<\/span>Response<span class=\"token operator\">&gt;<\/span> <span class=\"token class-name\">HttpClient<\/span><span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> url<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    Request req<span class=\"token punctuation\">;<\/span><br \/>\n    req<span class=\"token punctuation\">.<\/span>url <span class=\"token operator\">&#061;<\/span> url<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token function\">send<\/span><span class=\"token punctuation\">(<\/span>req<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>Result<span class=\"token operator\">&lt;<\/span>Response<span class=\"token operator\">&gt;<\/span> <span class=\"token class-name\">HttpClient<\/span><span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">post<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> url<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> body<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    Request req<span class=\"token punctuation\">;<\/span><br \/>\n    req<span class=\"token punctuation\">.<\/span>method <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;POST&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    req<span class=\"token punctuation\">.<\/span>url <span class=\"token operator\">&#061;<\/span> url<span class=\"token punctuation\">;<\/span><br \/>\n    req<span class=\"token punctuation\">.<\/span>body <span class=\"token operator\">&#061;<\/span> body<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token function\">send<\/span><span class=\"token punctuation\">(<\/span>req<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token punctuation\">}<\/span> <span class=\"token comment\">\/\/ namespace net<\/span><\/p>\n<h5>3.3.3 \u7b2c\u4e09\u9636\u6bb5&#xff1a;\u534f\u7a0b\u5f02\u6b65\u5316&#xff08;\u8017\u65f63\u5929&#xff09;<\/h5>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u8fc1\u79fb\u540e&#xff1a;\u534f\u7a0b\u5f02\u6b65\u63a5\u53e3<\/span><br \/>\n<span class=\"token comment\">\/\/ \u6587\u4ef6&#xff1a;include\/net\/http_client_coro.h<\/span><br \/>\n<span class=\"token comment\">\/\/ \u6548\u679c&#xff1a;\u5f02\u6b65\u4ee3\u7801\u8bfb\u8d77\u6765\u50cf\u540c\u6b65\u4ee3\u7801&#xff01;<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">pragma<\/span> <span class=\"token expression\">once<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;net\/error.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;net\/http_client.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;generator&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;coroutine&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;vector&gt;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">namespace<\/span> net<span class=\"token double-colon punctuation\">::<\/span>async <span class=\"token punctuation\">{<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u7b80\u5316\u7684\u5f02\u6b65Task&#xff08;\u5b9e\u9645\u9879\u76ee\u4e2d\u4f7f\u7528\u66f4\u5b8c\u5584\u7684\u5b9e\u73b0&#xff09;<\/span><br \/>\n<span class=\"token keyword\">template<\/span> <span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">typename<\/span> <span class=\"token class-name\">T<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">Task<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">promise_type<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>optional<span class=\"token operator\">&lt;<\/span>T<span class=\"token operator\">&gt;<\/span> result_<span class=\"token punctuation\">;<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>exception_ptr error_<span class=\"token punctuation\">;<\/span><br \/>\n        Task <span class=\"token function\">get_return_object<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> Task<span class=\"token punctuation\">{<\/span>std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token class-name\">coroutine_handle<\/span><span class=\"token operator\">&lt;<\/span>promise_type<span class=\"token operator\">&gt;<\/span><span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">from_promise<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span><span class=\"token keyword\">this<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>suspend_never <span class=\"token function\">initial_suspend<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">noexcept<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>suspend_always <span class=\"token function\">final_suspend<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">noexcept<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">void<\/span> <span class=\"token function\">return_value<\/span><span class=\"token punctuation\">(<\/span>T v<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> result_ <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">move<\/span><span class=\"token punctuation\">(<\/span>v<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">void<\/span> <span class=\"token function\">unhandled_exception<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> error_ <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">current_exception<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>coroutine_handle<span class=\"token operator\">&lt;<\/span>promise_type<span class=\"token operator\">&gt;<\/span> h_<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">explicit<\/span> <span class=\"token function\">Task<\/span><span class=\"token punctuation\">(<\/span>std<span class=\"token double-colon punctuation\">::<\/span>coroutine_handle<span class=\"token operator\">&lt;<\/span>promise_type<span class=\"token operator\">&gt;<\/span> h<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">:<\/span> <span class=\"token function\">h_<\/span><span class=\"token punctuation\">(<\/span>h<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token function\">Task<\/span><span class=\"token punctuation\">(<\/span>Task<span class=\"token operator\">&amp;&amp;<\/span> o<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">noexcept<\/span> <span class=\"token operator\">:<\/span> <span class=\"token function\">h_<\/span><span class=\"token punctuation\">(<\/span>o<span class=\"token punctuation\">.<\/span>h_<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> o<span class=\"token punctuation\">.<\/span>h_ <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token operator\">~<\/span><span class=\"token function\">Task<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>h_<span class=\"token punctuation\">)<\/span> h_<span class=\"token punctuation\">.<\/span><span class=\"token function\">destroy<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n    T <span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>h_<span class=\"token punctuation\">.<\/span><span class=\"token function\">promise<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>error_<span class=\"token punctuation\">)<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">rethrow_exception<\/span><span class=\"token punctuation\">(<\/span>h_<span class=\"token punctuation\">.<\/span><span class=\"token function\">promise<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>error_<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">move<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>h_<span class=\"token punctuation\">.<\/span><span class=\"token function\">promise<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>result_<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u2605\u2605\u2605 \u5f02\u6b65GET&#xff1a;\u8bfb\u8d77\u6765\u50cf\u540c\u6b65\u4ee3\u7801 \u2605\u2605\u2605<\/span><br \/>\nTask<span class=\"token operator\">&lt;<\/span>Result<span class=\"token operator\">&lt;<\/span>Response<span class=\"token operator\">&gt;&gt;<\/span> <span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> url<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5b9e\u9645\u4e2d\u8fd9\u91cc\u4f1a co_await \u5f02\u6b65I\/O<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u4f46\u4ee3\u7801\u7ed3\u6784\u4e0e\u540c\u6b65\u7248\u672c\u5b8c\u5168\u4e00\u81f4&#xff01;<\/span><br \/>\n    HttpClient client<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">co_return<\/span> client<span class=\"token punctuation\">.<\/span><span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span>url<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u2605\u2605\u2605 \u5e26\u91cd\u8bd5\u7684\u5f02\u6b65\u8bf7\u6c42 \u2605\u2605\u2605<\/span><br \/>\nTask<span class=\"token operator\">&lt;<\/span>Result<span class=\"token operator\">&lt;<\/span>Response<span class=\"token operator\">&gt;&gt;<\/span> <span class=\"token function\">get_with_retry<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> url<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> max_retries <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">3<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> attempt <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span> attempt <span class=\"token operator\">&lt;&#061;<\/span> max_retries<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>attempt<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">auto<\/span> result <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">co_await<\/span> <span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span>url<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u5f02\u6b65\u7b49\u5f85<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">.<\/span><span class=\"token function\">has_value<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">co_return<\/span> result<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u6210\u529f&#xff01;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>result<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">retryable<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">||<\/span> attempt <span class=\"token operator\">&#061;&#061;<\/span> max_retries<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">co_return<\/span> result<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u4e0d\u53ef\u91cd\u8bd5\u6216\u5df2\u8fbe\u4e0a\u9650<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u5b9e\u9645\u4e2d&#xff1a;co_await sleep(backoff_duration);<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">co_return<\/span> <span class=\"token function\">NET_ERROR<\/span><span class=\"token punctuation\">(<\/span>Timeout<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u8d85\u8fc7\u6700\u5927\u91cd\u8bd5\u6b21\u6570&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u2605\u2605\u2605 \u6279\u91cf\u8bf7\u6c42&#xff1a;\u4f7f\u7528generator\u4ea7\u51fa\u8fdb\u5ea6 \u2605\u2605\u2605<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">BatchProgress<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> completed<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> total<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string url<span class=\"token punctuation\">;<\/span><br \/>\n    Result<span class=\"token operator\">&lt;<\/span>Response<span class=\"token operator\">&gt;<\/span> result<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>std<span class=\"token double-colon punctuation\">::<\/span>generator<span class=\"token operator\">&lt;<\/span>BatchProgress<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">batch_get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&amp;<\/span> urls<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> total <span class=\"token operator\">&#061;<\/span> <span class=\"token generic-function\"><span class=\"token function\">static_cast<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>urls<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    HttpClient client<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> total<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">auto<\/span> result <span class=\"token operator\">&#061;<\/span> client<span class=\"token punctuation\">.<\/span><span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span>urls<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">co_yield<\/span> BatchProgress<span class=\"token punctuation\">{<\/span>i <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> total<span class=\"token punctuation\">,<\/span> urls<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">move<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token punctuation\">}<\/span> <span class=\"token comment\">\/\/ namespace net::async<\/span><\/p>\n<h4>3.4 \u8fc1\u79fb\u524d\u540e\u7684\u4ee3\u7801\u91cf\u5bf9\u6bd4<\/h4>\n<p>\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557<br \/>\n\u2551              \u8fc1\u79fb\u524d\u540e\u4ee3\u7801\u91cf\u5bf9\u6bd4&#xff08;\u6838\u5fc3\u7f51\u7edc\u6a21\u5757&#xff09;              \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u6307\u6807                    \u2502  \u8fc1\u79fb\u524d    \u2502  \u8fc1\u79fb\u540e    \u2502 \u53d8\u5316  \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u9519\u8bef\u5904\u7406\u76f8\u5173\u4ee3\u7801\u884c\u6570     \u2502  3,200\u884c   \u2502  1,100\u884c   \u2502 -66%  \u2551<br \/>\n\u2551  \u56de\u8c03\u7c7b\u578b\u5b9a\u4e49            \u2502  6\u79cd       \u2502  0\u79cd       \u2502 -100% \u2551<br \/>\n\u2551  \u9519\u8bef\u7801#define\u6570\u91cf        \u2502  47\u4e2a      \u2502  0\u4e2a       \u2502 -100% \u2551<br \/>\n\u2551  try-catch\u5757\u6570\u91cf         \u2502  89\u4e2a      \u2502  12\u4e2a      \u2502 -87%  \u2551<br \/>\n\u2551  \u5f02\u6b65\u51fd\u6570\u6570\u91cf            \u2502  34\u4e2a      \u2502  34\u4e2a      \u2502  0%   \u2551<br \/>\n\u2551  \u5f02\u6b65\u51fd\u6570\u5e73\u5747\u884c\u6570        \u2502  45\u884c      \u2502  18\u884c      \u2502 -60%  \u2551<br \/>\n\u2551  \u5d4c\u5957\u56de\u8c03\u6700\u5927\u6df1\u5ea6        \u2502  5\u5c42       \u2502  0\u5c42       \u2502 -100% \u2551<br \/>\n\u2551  \u5355\u5143\u6d4b\u8bd5\u7528\u4f8b\u6570          \u2502  156\u4e2a     \u2502  203\u4e2a     \u2502 &#043;30%  \u2551<br \/>\n\u2551  \u6d4b\u8bd5\u8986\u76d6\u7387              \u2502  62%       \u2502  81%       \u2502 &#043;19%  \u2551<br \/>\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d<\/p>\n<h4>3.5 \u6548\u679c\u4eae\u70b9\u603b\u7ed3<\/h4>\n<ul>\n<li>\u9519\u8bef\u5904\u7406\u4ee3\u7801\u51cf\u5c1166%&#xff0c;\u540c\u65f6\u9519\u8bef\u4fe1\u606f\u8d28\u91cf\u5927\u5e45\u63d0\u5347<\/li>\n<li>\u56de\u8c03\u5730\u72f1\u5b8c\u5168\u6d88\u9664&#xff0c;\u5f02\u6b65\u4ee3\u7801\u7684\u53ef\u8bfb\u6027\u63a5\u8fd1\u540c\u6b65\u4ee3\u7801<\/li>\n<li>\u6d4b\u8bd5\u8986\u76d6\u7387\u63d0\u534719%&#xff0c;\u56e0\u4e3astd::expected\u8ba9\u9519\u8bef\u8def\u5f84\u66f4\u5bb9\u6613\u6d4b\u8bd5<\/li>\n<li>\u8fc1\u79fb\u603b\u8017\u65f610\u4e2a\u5de5\u4f5c\u65e5&#xff08;8\u4eba\u56e2\u961f&#xff09;&#xff0c;\u6295\u5165\u4ea7\u51fa\u6bd4\u6781\u9ad8<\/li>\n<\/ul>\n<hr \/>\n<h3>\u56db\u3001\u7f16\u8bd1\u671f\u8bca\u65ad\u4e0e\u8fd0\u884c\u65f6\u6027\u80fd\u5bf9\u6bd4\u5b9e\u6d4b<\/h3>\n<h4>4.1 \u7f16\u8bd1\u671f\u8bca\u65ad\u7684\u7cbe\u51c6\u5ea6\u5c55\u793a<\/h4>\n<h5>4.1.1 \u6a21\u677f\u9519\u8bef\u4fe1\u606f\u7684\u53ef\u8bfb\u6027\u98de\u8dc3<\/h5>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u6d4b\u8bd5&#xff1a;\u6545\u610f\u5236\u9020\u7c7b\u578b\u9519\u8bef&#xff0c;\u89c2\u5bdf\u7f16\u8bd1\u5668\u8bca\u65ad<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;expected&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string&gt;<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u9519\u8bef1&#xff1a;and_then\u7684lambda\u8fd4\u56de\u7c7b\u578b\u4e0d\u5bf9<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">test_error_1<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> e <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">42<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u2717 \u9519\u8bef&#xff1a;and_then\u8981\u6c42\u8fd4\u56deexpected&#xff0c;\u4f46lambda\u8fd4\u56deint<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> r <span class=\"token operator\">&#061;<\/span> e<span class=\"token punctuation\">.<\/span><span class=\"token function\">and_then<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> x<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> x <span class=\"token operator\">*<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ GCC 15\u7684\u9519\u8bef\u4fe1\u606f&#xff08;2026\u5e74&#xff09;&#xff1a;<\/span><br \/>\n    <span class=\"token comment\">\/\/ error: no matching function for call to &#039;std::expected&lt;int, std::string&gt;::and_then(main()::&lt;lambda(int)&gt;)&#039;<\/span><br \/>\n    <span class=\"token comment\">\/\/   required from here<\/span><br \/>\n    <span class=\"token comment\">\/\/   note: candidate: &#039;template&lt;class F&gt; auto std::expected&lt;_Tp, _Ep&gt;::and_then(F&amp;&amp;) <\/span><br \/>\n    <span class=\"token comment\">\/\/          [with F &#061; main()::&lt;lambda(int)&gt;]&#039;<\/span><br \/>\n    <span class=\"token comment\">\/\/   note: the required expression &#039;f(declval&lt;int&amp;&gt;())&#039; is invalid, because:<\/span><br \/>\n    <span class=\"token comment\">\/\/   note: &#039;std::expected&lt;int, std::string&gt;&#039; is not convertible from &#039;int&#039;<\/span><br \/>\n    <span class=\"token comment\">\/\/   note: did you mean to use &#039;transform&#039; instead of &#039;and_then&#039;?  \u2190 \u2605\u2605\u2605 \u667a\u80fd\u5efa\u8bae&#xff01;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u2713 \u4fee\u6b63&#xff1a;\u4f7f\u7528transform<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> r2 <span class=\"token operator\">&#061;<\/span> e<span class=\"token punctuation\">.<\/span><span class=\"token function\">transform<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> x<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> x <span class=\"token operator\">*<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u9519\u8bef2&#xff1a;\u9519\u8bef\u7c7b\u578b\u4e0d\u5339\u914d<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">test_error_2<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> e <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">42<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u2717 \u9519\u8bef&#xff1a;or_else\u7684lambda\u5e94\u8be5\u63a5\u53d7string&#xff08;\u9519\u8bef\u7c7b\u578b&#xff09;&#xff0c;\u4f46\u63a5\u53d7\u4e86int<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> r <span class=\"token operator\">&#061;<\/span> e<span class=\"token punctuation\">.<\/span><span class=\"token function\">or_else<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> x<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">-&gt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> x<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ GCC 15\u7684\u9519\u8bef\u4fe1\u606f&#xff1a;<\/span><br \/>\n    <span class=\"token comment\">\/\/ error: no matching function for call to &#039;or_else&#039;<\/span><br \/>\n    <span class=\"token comment\">\/\/   note: cannot convert &#039;std::string&#039; to &#039;int&#039; in argument 1<\/span><br \/>\n    <span class=\"token comment\">\/\/   note: the error type of the expected is &#039;std::string&#039;, <\/span><br \/>\n    <span class=\"token comment\">\/\/         but the lambda accepts &#039;int&#039;  \u2190 \u2605\u2605\u2605 \u660e\u786e\u6307\u51fa\u7c7b\u578b\u4e0d\u5339\u914d\u7684\u539f\u56e0<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h5>4.1.2 CLion\u7684\u5b9e\u65f6\u8bca\u65ad\u901f\u5ea6<\/h5>\n<p>\u5b9e\u6d4b\u6570\u636e&#xff08;CLion 2026.1 &#043; Nova\u5f15\u64ce&#xff09;&#xff1a;<\/p>\n<p>\u64cd\u4f5c&#xff1a;\u5728\u4e00\u4e2a500\u884c\u7684\u6587\u4ef6\u4e2d\u4fee\u6539\u4e00\u4e2a\u51fd\u6570\u7684\u8fd4\u56de\u7c7b\u578b<br \/>\n     \u4ece std::expected&lt;int, std::string&gt; \u6539\u4e3a std::expected&lt;long, std::string&gt;<\/p>\n<p>\u8bca\u65ad\u54cd\u5e94\u65f6\u95f4&#xff1a;<br \/>\n&#8211; \u7ea2\u8272\u6ce2\u6d6a\u7ebf\u51fa\u73b0&#xff1a;0.2\u79d2<br \/>\n&#8211; \u6240\u6709\u53d7\u5f71\u54cd\u7684\u8c03\u7528\u70b9\u6807\u7ea2&#xff1a;0.5\u79d2<br \/>\n&#8211; \u5feb\u901f\u4fee\u590d\u5efa\u8bae\u51fa\u73b0&#xff1a;0.3\u79d2&#xff08;\u9f20\u6807\u60ac\u505c\u65f6&#xff09;<br \/>\n&#8211; \u5b8c\u6574\u7684\u5f71\u54cd\u5206\u6790&#xff08;Find Usages&#xff09;&#xff1a;1.2\u79d2<\/p>\n<p>\u5bf9\u6bd4CLion 2024.3&#xff08;Classic\u5f15\u64ce&#xff09;&#xff1a;<br \/>\n&#8211; \u7ea2\u8272\u6ce2\u6d6a\u7ebf\u51fa\u73b0&#xff1a;1.5\u79d2<br \/>\n&#8211; \u6240\u6709\u8c03\u7528\u70b9\u6807\u7ea2&#xff1a;3.8\u79d2<br \/>\n&#8211; \u5feb\u901f\u4fee\u590d\u5efa\u8bae&#xff1a;2.1\u79d2<br \/>\n&#8211; \u5f71\u54cd\u5206\u6790&#xff1a;4.5\u79d2<\/p>\n<p>\u7ed3\u8bba&#xff1a;Nova\u5f15\u64ce\u7684\u8bca\u65ad\u901f\u5ea6\u63d0\u5347\u7ea63-4\u500d<\/p>\n<h4>4.2 \u8fd0\u884c\u65f6\u6027\u80fd\u5b9e\u6d4b<\/h4>\n<h5>4.2.1 \u6d4b\u8bd5\u73af\u5883\u4e0e\u65b9\u6cd5\u8bba<\/h5>\n<p>\u6d4b\u8bd5\u73af\u5883&#xff1a;<br \/>\n&#8211; CPU: AMD Ryzen 9 7950X (16\u683832\u7ebf\u7a0b, 5.7GHz boost)<br \/>\n&#8211; RAM: 64GB DDR5-6000<br \/>\n&#8211; OS: Ubuntu 24.04 LTS (kernel 6.8)<br \/>\n&#8211; \u7f16\u8bd1\u5668: GCC 15.1 (-O2 -std&#061;c&#043;&#043;23 -march&#061;native)<br \/>\n&#8211; \u57fa\u51c6\u6846\u67b6: Google Benchmark 1.9.0<br \/>\n&#8211; \u6bcf\u7ec4\u6d4b\u8bd5: 100\u6b21\u8fed\u4ee3&#xff0c;\u53d6\u4e2d\u4f4d\u6570<br \/>\n&#8211; CPU\u9891\u7387\u9501\u5b9a: cpupower frequency-set -g performance<\/p>\n<h5>4.2.2 \u6210\u529f\u8def\u5f84&#xff1a;expected vs \u5f02\u5e38 vs \u9519\u8bef\u7801<\/h5>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u6027\u80fd\u6d4b\u8bd5&#xff1a;\u6210\u529f\u8def\u5f84&#xff08;\u64cd\u4f5c\u603b\u662f\u6210\u529f&#xff09;<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;benchmark\/benchmark.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;expected&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdexcept&gt;<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u88ab\u6d4b\u51fd\u6570&#xff1a;\u7b80\u5355\u7684\u6574\u6570\u9664\u6cd5<\/span><br \/>\n<span class=\"token function\">__attribute__<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>noinline<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">int<\/span> <span class=\"token function\">divide_throw<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> a<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> b<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>b <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">throw<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">runtime_error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;div0&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> a <span class=\"token operator\">\/<\/span> b<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token function\">__attribute__<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>noinline<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token function\">divide_expected<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> a<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> b<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>b <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;div0&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> a <span class=\"token operator\">\/<\/span> b<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token function\">__attribute__<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>noinline<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">int<\/span> <span class=\"token function\">divide_errcode<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> a<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> b<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span><span class=\"token operator\">&amp;<\/span> out<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>b <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    out <span class=\"token operator\">&#061;<\/span> a <span class=\"token operator\">\/<\/span> b<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">BM_Throw_Success<\/span><span class=\"token punctuation\">(<\/span>benchmark<span class=\"token double-colon punctuation\">::<\/span>State<span class=\"token operator\">&amp;<\/span> state<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span> _ <span class=\"token operator\">:<\/span> state<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">auto<\/span> r <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">divide_throw<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">100<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">3<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        benchmark<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">DoNotOptimize<\/span><span class=\"token punctuation\">(<\/span>r<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">BM_Expected_Success<\/span><span class=\"token punctuation\">(<\/span>benchmark<span class=\"token double-colon punctuation\">::<\/span>State<span class=\"token operator\">&amp;<\/span> state<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span> _ <span class=\"token operator\">:<\/span> state<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">auto<\/span> r <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">divide_expected<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">100<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">3<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        benchmark<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">DoNotOptimize<\/span><span class=\"token punctuation\">(<\/span>r<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">BM_ErrCode_Success<\/span><span class=\"token punctuation\">(<\/span>benchmark<span class=\"token double-colon punctuation\">::<\/span>State<span class=\"token operator\">&amp;<\/span> state<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> out<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span> _ <span class=\"token operator\">:<\/span> state<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">auto<\/span> err <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">divide_errcode<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">100<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">3<\/span><span class=\"token punctuation\">,<\/span> out<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        benchmark<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">DoNotOptimize<\/span><span class=\"token punctuation\">(<\/span>err<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        benchmark<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">DoNotOptimize<\/span><span class=\"token punctuation\">(<\/span>out<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token function\">BENCHMARK<\/span><span class=\"token punctuation\">(<\/span>BM_Throw_Success<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">BENCHMARK<\/span><span class=\"token punctuation\">(<\/span>BM_Expected_Success<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">BENCHMARK<\/span><span class=\"token punctuation\">(<\/span>BM_ErrCode_Success<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">BENCHMARK_MAIN<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u6d4b\u8bd5\u7ed3\u679c&#xff08;\u6210\u529f\u8def\u5f84&#xff09;&#xff1a;<\/p>\n<p>\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557<br \/>\n\u2551           \u6210\u529f\u8def\u5f84\u6027\u80fd&#xff08;\u8d8a\u5c0f\u8d8a\u597d&#xff09;                    \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u65b9\u5f0f              \u2502  \u8017\u65f6(ns)  \u2502  \u76f8\u5bf9\u5f00\u9500         \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u9519\u8bef\u7801            \u2502   0.72     \u2502  1.00x (\u57fa\u51c6)     \u2551<br \/>\n\u2551  std::expected     \u2502   0.81     \u2502  1.13x            \u2551<br \/>\n\u2551  \u5f02\u5e38(\u65e0throw)     \u2502   0.89     \u2502  1.24x            \u2551<br \/>\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d<\/p>\n<p>\u7ed3\u8bba&#xff1a;\u6210\u529f\u8def\u5f84\u4e0a&#xff0c;expected\u4ec5\u6bd4\u9519\u8bef\u7801\u616213%&#xff0c;\u5b8c\u5168\u53ef\u5ffd\u7565\u3002<\/p>\n<h5>4.2.3 \u5931\u8d25\u8def\u5f84&#xff1a;\u6570\u91cf\u7ea7\u7684\u5dee\u8ddd<\/h5>\n<p><span class=\"token comment\">\/\/ \u6027\u80fd\u6d4b\u8bd5&#xff1a;\u5931\u8d25\u8def\u5f84&#xff08;\u64cd\u4f5c\u603b\u662f\u5931\u8d25&#xff09;<\/span><br \/>\n<span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">BM_Throw_Failure<\/span><span class=\"token punctuation\">(<\/span>benchmark<span class=\"token double-colon punctuation\">::<\/span>State<span class=\"token operator\">&amp;<\/span> state<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span> _ <span class=\"token operator\">:<\/span> state<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">try<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">auto<\/span> r <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">divide_throw<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">100<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            benchmark<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">DoNotOptimize<\/span><span class=\"token punctuation\">(<\/span>r<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">catch<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">BM_Expected_Failure<\/span><span class=\"token punctuation\">(<\/span>benchmark<span class=\"token double-colon punctuation\">::<\/span>State<span class=\"token operator\">&amp;<\/span> state<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span> _ <span class=\"token operator\">:<\/span> state<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">auto<\/span> r <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">divide_expected<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">100<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>r<span class=\"token punctuation\">)<\/span> benchmark<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">DoNotOptimize<\/span><span class=\"token punctuation\">(<\/span>r<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">BM_ErrCode_Failure<\/span><span class=\"token punctuation\">(<\/span>benchmark<span class=\"token double-colon punctuation\">::<\/span>State<span class=\"token operator\">&amp;<\/span> state<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> out<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span> _ <span class=\"token operator\">:<\/span> state<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">auto<\/span> err <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">divide_errcode<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">100<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> out<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        benchmark<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">DoNotOptimize<\/span><span class=\"token punctuation\">(<\/span>err<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u6d4b\u8bd5\u7ed3\u679c&#xff08;\u5931\u8d25\u8def\u5f84&#xff09;&#xff1a;<\/p>\n<p>\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557<br \/>\n\u2551           \u5931\u8d25\u8def\u5f84\u6027\u80fd&#xff08;\u8d8a\u5c0f\u8d8a\u597d&#xff09;                         \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u65b9\u5f0f                    \u2502  \u8017\u65f6(ns)  \u2502  \u76f8\u5bf9\u5f00\u9500        \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u9519\u8bef\u7801                  \u2502   0.68     \u2502  1.00x (\u57fa\u51c6)    \u2551<br \/>\n\u2551  std::expected(char*)    \u2502   1.15     \u2502  1.69x           \u2551<br \/>\n\u2551  std::expected(string)   \u2502  38.40     \u2502  56.5x           \u2551<br \/>\n\u2551  \u5f02\u5e38(throw&#043;catch)       \u2502  985.00    \u2502  1448x !!!       \u2551<br \/>\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d<\/p>\n<p>\u2605\u2605\u2605 \u5173\u952e\u53d1\u73b0&#xff1a;\u5f02\u5e38\u629b\u51fa&#043;\u6355\u83b7\u6bd4expected\u6162\u7ea61000\u500d&#xff01;<br \/>\n    \u5373\u4f7fexpected\u4f7f\u7528std::string\u4f5c\u4e3a\u9519\u8bef\u7c7b\u578b&#xff08;\u6d89\u53ca\u5806\u5206\u914d&#xff09;&#xff0c;<br \/>\n    \u4ecd\u7136\u6bd4\u5f02\u5e38\u5feb25\u500d\u3002<\/p>\n<h5>4.2.4 \u534f\u7a0b vs \u56de\u8c03 vs future<\/h5>\n<p>\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557<br \/>\n\u2551        \u5f02\u6b65\u6a21\u578b\u6027\u80fd\u5bf9\u6bd4&#xff08;1000\u6b21\u5f02\u6b65\u64cd\u4f5c&#xff09;                  \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u6a21\u578b              \u2502  \u603b\u8017\u65f6(\u03bcs)  \u2502  \u5185\u5b58\u5cf0\u503c(KB)       \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u56de\u8c03              \u2502   125        \u2502  48                 \u2551<br \/>\n\u2551  std::future       \u2502   210        \u2502  156                \u2551<br \/>\n\u2551  \u534f\u7a0b(generator)   \u2502   142        \u2502  52                 \u2551<br \/>\n\u2551  \u534f\u7a0b(\u81ea\u5b9a\u4e49Task)  \u2502   138        \u2502  44                 \u2551<br \/>\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d<\/p>\n<p>\u7ed3\u8bba&#xff1a;\u534f\u7a0b\u7684\u6027\u80fd\u4e0e\u56de\u8c03\u51e0\u4e4e\u6301\u5e73&#xff08;\u5dee\u8ddd&lt;15%&#xff09;&#xff0c;<br \/>\n      \u4f46\u4ee3\u7801\u53ef\u8bfb\u6027\u8fdc\u8d85\u56de\u8c03\u3002<br \/>\n      std::future\u7531\u4e8e\u6d89\u53ca\u5171\u4eab\u72b6\u6001\u548c\u6761\u4ef6\u53d8\u91cf&#xff0c;\u5f00\u9500\u6700\u5927\u3002<\/p>\n<h4>4.3 \u5185\u5b58\u5360\u7528\u5bf9\u6bd4<\/h4>\n<p>\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557<br \/>\n\u2551        sizeof\u5bf9\u6bd4&#xff08;64\u4f4d\u5e73\u53f0&#xff09;                         \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u7c7b\u578b                              \u2502  \u5927\u5c0f(bytes)   \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  int                               \u2502   4            \u2551<br \/>\n\u2551  std::optional&lt;int&gt;                \u2502   8            \u2551<br \/>\n\u2551  std::expected&lt;int, int&gt;           \u2502   8            \u2551<br \/>\n\u2551  std::expected&lt;int, std::string&gt;   \u2502  40            \u2551<br \/>\n\u2551  std::expected&lt;void, int&gt;          \u2502   8            \u2551<br \/>\n\u2551  std::expected&lt;void, std::string&gt;  \u2502  32            \u2551<br \/>\n\u2551  std::coroutine_handle&lt;&gt;           \u2502   8            \u2551<br \/>\n\u2551  std::generator&lt;int&gt; (\u5bf9\u8c61\u672c\u8eab)     \u2502   8            \u2551<br \/>\n\u2551  \u534f\u7a0b\u5e27(\u7b80\u5355\u534f\u7a0b)                   \u2502  32-64         \u2551<br \/>\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d<\/p>\n<p>\u5206\u6790&#xff1a;<br \/>\n&#8211; expected&lt;int, int&gt;\u4e0eoptional&lt;int&gt;\u5927\u5c0f\u76f8\u540c&#xff08;8\u5b57\u8282&#xff09;&#xff0c;\u96f6\u989d\u5916\u5f00\u9500<br \/>\n&#8211; expected&lt;void, E&gt;\u4ec5\u6bd4E\u672c\u8eab\u591a\u4e00\u4e2abool\u6807\u5fd7\u4f4d<br \/>\n&#8211; \u534f\u7a0b\u5e27\u5927\u5c0f\u53d6\u51b3\u4e8e\u5c40\u90e8\u53d8\u91cf\u6570\u91cf&#xff0c;\u7b80\u5355\u534f\u7a0b\u7ea632-64\u5b57\u8282<\/p>\n<h4>4.4 \u6548\u679c\u4eae\u70b9\u603b\u7ed3<\/h4>\n<p>\u6027\u80fd\u8bc4\u6d4b\u6838\u5fc3\u7ed3\u8bba&#xff1a;<\/p>\n<p>1. std::expected\u5728\u6210\u529f\u8def\u5f84\u4e0a\u51e0\u4e4e\u96f6\u5f00\u9500&#xff08;&#043;13%&#xff09;<br \/>\n2. std::expected\u5728\u5931\u8d25\u8def\u5f84\u4e0a\u6bd4\u5f02\u5e38\u5feb1000\u500d<br \/>\n3. \u534f\u7a0b\u7684\u6027\u80fd\u4e0e\u56de\u8c03\u6301\u5e73&#xff0c;\u4f46\u53ef\u8bfb\u6027\u8fdc\u8d85<br \/>\n4. CLion Nova\u5f15\u64ce\u7684\u5b9e\u65f6\u8bca\u65ad\u901f\u5ea6\u6bd4Classic\u5feb3-4\u500d<br \/>\n5. \u7f16\u8bd1\u5668\u7684\u9519\u8bef\u4fe1\u606f\u8d28\u91cf\u663e\u8457\u63d0\u5347&#xff0c;\u80fd\u7ed9\u51fa\u4fee\u590d\u5efa\u8bae<\/p>\n<hr \/>\n<h3>\u4e94\u3001\u667a\u80fd\u63d0\u793a\u4e0e\u91cd\u6784\u5de5\u5177\u7684\u5b9e\u9645\u8f85\u52a9\u6548\u679c<\/h3>\n<h4>5.1 \u4ee3\u7801\u8865\u5168\u7684\u667a\u80fd\u7a0b\u5ea6<\/h4>\n<h5>5.1.1 Monadic\u94fe\u7684\u4e0a\u4e0b\u6587\u611f\u77e5\u8865\u5168<\/h5>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ CLion 2026.1 Nova\u5f15\u64ce\u7684\u8865\u5168\u6f14\u793a<\/span><br \/>\n<span class=\"token comment\">\/\/ \u4ee5\u4e0b\u6ce8\u91ca\u63cf\u8ff0\u4e86\u5b9e\u9645\u7684IDE\u4ea4\u4e92\u4f53\u9a8c<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;expected&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string&gt;<\/span><\/span><\/p>\n<p>std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">get_value<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">to_string_safe<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">double<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">parse_double<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> s<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token function\">completion_demo<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> result <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">get_value<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u573a\u666f1&#xff1a;\u8f93\u5165 &#034;result.&#034; \u540e\u6309 Ctrl&#043;Space<\/span><br \/>\n    <span class=\"token comment\">\/\/ CLion\u663e\u793a\u7684\u8865\u5168\u5217\u8868&#xff08;\u6309\u76f8\u5173\u6027\u6392\u5e8f&#xff09;&#xff1a;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u2502 \u2605 and_then(&#8230;)     \u2192 expected&lt;U, string&gt;       \u2502<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u2502 \u2605 transform(&#8230;)    \u2192 expected&lt;U, string&gt;       \u2502<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u2502 \u2605 or_else(&#8230;)      \u2192 expected&lt;int, G&gt;          \u2502<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u2502   transform_error(&#8230;) \u2192 expected&lt;int, G&gt;       \u2502<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u2502   has_value()       \u2192 bool                      \u2502<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u2502   value()           \u2192 int&amp;                      \u2502<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u2502   error()           \u2192 string&amp;                   \u2502<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u2502   value_or(&#8230;)     \u2192 int                       \u2502<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u2502   operator*()       \u2192 int&amp;                      \u2502<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u2502   operator-&gt;()      \u2192 int*                      \u2502<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6ce8\u610f&#xff1a;Monadic\u64cd\u4f5c\u88ab\u6392\u5728\u6700\u524d\u9762&#xff08;Nova\u5f15\u64ce\u7684\u667a\u80fd\u6392\u5e8f&#xff09;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u573a\u666f2&#xff1a;\u9009\u62e9and_then\u540e&#xff0c;\u8f93\u5165lambda<\/span><br \/>\n    <span class=\"token comment\">\/\/ result.and_then([](int x) {<\/span><br \/>\n    <span class=\"token comment\">\/\/     \/\/ \u6b64\u5904\u6309Ctrl&#043;Space<\/span><br \/>\n    <span class=\"token comment\">\/\/     \/\/ CLion\u77e5\u9053lambda\u5fc5\u987b\u8fd4\u56de expected&lt;U, std::string&gt;<\/span><br \/>\n    <span class=\"token comment\">\/\/     \/\/ \u8865\u5168\u5217\u8868\u4f1a\u4f18\u5148\u663e\u793a\u8fd4\u56deexpected\u7684\u51fd\u6570&#xff1a;<\/span><br \/>\n    <span class=\"token comment\">\/\/     \/\/ \u2605 to_string_safe(x)  \u2192 expected&lt;string, string&gt; \u2713<\/span><br \/>\n    <span class=\"token comment\">\/\/     \/\/ \u2605 parse_double(&#8230;)  \u2192 expected&lt;double, string&gt; \u2713<\/span><br \/>\n    <span class=\"token comment\">\/\/     \/\/   std::to_string(x)  \u2192 string \u2717 (\u7c7b\u578b\u4e0d\u5339\u914d&#xff0c;\u7070\u8272\u663e\u793a)<\/span><br \/>\n    <span class=\"token comment\">\/\/ });<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u573a\u666f3&#xff1a;\u94fe\u5f0f\u8865\u5168<\/span><br \/>\n    <span class=\"token comment\">\/\/ result.and_then(to_string_safe).|  \u2190 \u6b64\u5904\u6309.<\/span><br \/>\n    <span class=\"token comment\">\/\/ CLion\u77e5\u9053\u5f53\u524d\u7c7b\u578b\u662f expected&lt;string, string&gt;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u8865\u5168\u5217\u8868\u81ea\u52a8\u9002\u914d\u4e3astring\u7248\u672c\u7684Monadic\u64cd\u4f5c<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u573a\u666f4&#xff1a;transform\u7684\u7c7b\u578b\u63a8\u5bfc<\/span><br \/>\n    <span class=\"token comment\">\/\/ result.transform([](int x) { return x * 2.0; })<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u9f20\u6807\u60ac\u505c\u5728auto\u4e0a&#xff0c;CLion\u663e\u793a&#xff1a;<\/span><br \/>\n    <span class=\"token comment\">\/\/ &#034;std::expected&lt;double, std::string&gt;&#034;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u63a8\u5bfc\u5b8c\u5168\u6b63\u786e&#xff0c;\u5305\u62ecdouble\u662f\u4ecelambda\u8fd4\u56de\u7c7b\u578b\u63a8\u5bfc\u51fa\u7684<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h5>5.1.2 \u534f\u7a0b\u5173\u952e\u5b57\u7684\u573a\u666f\u5316\u63d0\u793a<\/h5>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;generator&gt;<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u573a\u666f&#xff1a;\u5728\u51fd\u6570\u4f53\u4e2d\u8f93\u5165 &#034;co_&#034;<\/span><br \/>\n<span class=\"token comment\">\/\/ CLion\u7684\u8865\u5168\u884c\u4e3a&#xff1a;<\/span><\/p>\n<p>std<span class=\"token double-colon punctuation\">::<\/span>generator<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token function\">demo_coro<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u8f93\u5165 &#034;co_&#034; \u540e&#xff1a;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u2502 \u2605 co_yield expr   (\u4ea7\u51fa\u503c\u5e76\u6682\u505c)             \u2502<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u2502   co_return       (\u7ed3\u675f\u534f\u7a0b)                 \u2502<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u2502   co_await expr   (\u7b49\u5f85\u5f02\u6b65\u64cd\u4f5c)             \u2502<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6ce8\u610f&#xff1a;\u5bf9\u4e8estd::generator&#xff0c;co_yield\u6392\u5728\u7b2c\u4e00\u4f4d<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u56e0\u4e3a\u8fd9\u662fgenerator\u6700\u5e38\u7528\u7684\u64cd\u4f5c<\/span><\/p>\n<p>    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">10<\/span><span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">co_yield<\/span> i<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u8f93\u5165co_y\u540e\u6309Tab\u76f4\u63a5\u8865\u5168<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5bf9\u6bd4&#xff1a;\u5728\u81ea\u5b9a\u4e49Task\u7c7b\u578b\u4e2d<\/span><br \/>\n<span class=\"token comment\">\/\/ struct Task { &#8230; };<\/span><br \/>\n<span class=\"token comment\">\/\/ Task&lt;int&gt; demo_task() {<\/span><br \/>\n<span class=\"token comment\">\/\/     \/\/ \u8f93\u5165 &#034;co_&#034; \u540e&#xff1a;<\/span><br \/>\n<span class=\"token comment\">\/\/     \/\/ \u2605 co_return expr  (\u8fd4\u56de\u503c)  \u2190 \u6392\u5728\u7b2c\u4e00\u4f4d<\/span><br \/>\n<span class=\"token comment\">\/\/     \/\/   co_await expr   (\u7b49\u5f85)<\/span><br \/>\n<span class=\"token comment\">\/\/     \/\/   co_yield        \u2190 \u7070\u8272\/\u4e0d\u663e\u793a&#xff08;Task\u4e0d\u652f\u6301yield&#xff09;<\/span><br \/>\n<span class=\"token comment\">\/\/ }<\/span><\/p>\n<h4>5.2 \u91cd\u6784\u64cd\u4f5c\u7684\u6d41\u7545\u5ea6<\/h4>\n<h5>5.2.1 \u9519\u8bef\u7801\u5230expected\u7684\u4e00\u952e\u8fc1\u79fb<\/h5>\n<p>CLion 2026.1\u4e2d\u7684\u91cd\u6784\u64cd\u4f5c\u6d41\u7a0b&#xff1a;<\/p>\n<p>\u539f\u59cb\u4ee3\u7801&#xff1a;<br \/>\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<br \/>\nint parse_port(const std::string&amp; s, int&amp; out) {<br \/>\n    if (s.empty()) return -1;<br \/>\n    out &#061; std::stoi(s);<br \/>\n    return 0;<br \/>\n}<\/p>\n<p>\u91cd\u6784\u6b65\u9aa4&#xff1a;<br \/>\n1. \u9009\u4e2d\u51fd\u6570\u7b7e\u540d\u4e2d\u7684 &#034;int&#034; \u8fd4\u56de\u7c7b\u578b<br \/>\n2. Ctrl&#043;Shift&#043;T (Refactor This) \u2192 &#034;Change Signature&#034;<br \/>\n3. \u5c06\u8fd4\u56de\u7c7b\u578b\u6539\u4e3a std::expected&lt;int, std::string&gt;<br \/>\n4. \u5220\u9664\u8f93\u51fa\u53c2\u6570 &#034;int&amp; out&#034;<br \/>\n5. CLion\u81ea\u52a8&#xff1a;<br \/>\n   &#8211; \u66f4\u65b0\u6240\u6709\u8c03\u7528\u70b9<br \/>\n   &#8211; \u5c06 &#034;return -1&#034; \u6807\u8bb0\u4e3a\u9700\u8981\u4fee\u6539&#xff08;\u7ea2\u8272\u6ce2\u6d6a\u7ebf&#xff09;<br \/>\n   &#8211; \u63d0\u4f9b\u5feb\u901f\u4fee\u590d&#xff1a;Alt&#043;Enter \u2192 &#034;Replace with std::unexpected&#034;<br \/>\n   &#8211; \u5c06 &#034;out &#061; std::stoi(s); return 0;&#034; \u5408\u5e76\u4e3a &#034;return std::stoi(s);&#034;<\/p>\n<p>\u91cd\u6784\u540e&#xff08;CLion\u8f85\u52a9\u5b8c\u6210&#xff09;&#xff1a;<br \/>\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<br \/>\nstd::expected&lt;int, std::string&gt; parse_port(const std::string&amp; s) {<br \/>\n    if (s.empty()) return std::unexpected(std::string(&#034;\u7aef\u53e3\u5b57\u7b26\u4e32\u4e3a\u7a7a&#034;));<br \/>\n    return std::stoi(s);<br \/>\n}<\/p>\n<p>\u6574\u4e2a\u8fc7\u7a0b\u8017\u65f6&#xff1a;\u7ea630\u79d2&#xff08;\u542b\u786e\u8ba4\u5bf9\u8bdd\u6846&#xff09;<br \/>\n\u624b\u52a8\u5b8c\u6210\u540c\u7b49\u91cd\u6784\u9884\u8ba1\u8017\u65f6&#xff1a;15-20\u5206\u949f<\/p>\n<h4>5.3 \u4ee3\u7801\u68c0\u67e5\u4e0e\u5feb\u901f\u4fee\u590d<\/h4>\n<p>CLion 2026.1\u5bf9std::expected\u7684\u4e13\u9879\u68c0\u67e5&#xff1a;<\/p>\n<p>\u68c0\u67e51&#xff1a;\u672a\u68c0\u67e5\u7684value()\u8c03\u7528<br \/>\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<br \/>\n\u4ee3\u7801&#xff1a;<br \/>\n  auto r &#061; get_value();<br \/>\n  int x &#061; r.value();  \/\/ \u2190 \u9ec4\u8272\u8b66\u544a\u6ce2\u6d6a\u7ebf<\/p>\n<p>\u8b66\u544a\u4fe1\u606f&#xff1a;<br \/>\n  &#034;Calling value() without checking has_value() may throw<br \/>\n   std::bad_expected_access&#034;<\/p>\n<p>\u5feb\u901f\u4fee\u590d&#xff08;Alt&#043;Enter&#xff09;&#xff1a;<br \/>\n  \u9009\u9879A: &#034;Add has_value() check&#034;<br \/>\n    \u2192 if (r.has_value()) { int x &#061; r.value(); }<\/p>\n<p>  \u9009\u9879B: &#034;Replace with value_or()&#034;<br \/>\n    \u2192 int x &#061; r.value_or(0);<\/p>\n<p>  \u9009\u9879C: &#034;Use operator* (suppress warning)&#034;<br \/>\n    \u2192 int x &#061; *r;  \/\/ \u6dfb\u52a0NOLINT\u6ce8\u91ca<\/p>\n<p>\u68c0\u67e52&#xff1a;Monadic\u94fe\u4e2d\u7684\u7c7b\u578b\u4e0d\u5339\u914d<br \/>\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<br \/>\n\u4ee3\u7801&#xff1a;<br \/>\n  get_value().and_then([](int x) { return x * 2; })<br \/>\n  \/\/ \u2190 \u7ea2\u8272\u9519\u8bef\u6ce2\u6d6a\u7ebf<\/p>\n<p>\u9519\u8bef\u4fe1\u606f&#xff1a;<br \/>\n  &#034;Lambda in and_then must return std::expected&lt;U, E&gt;,<br \/>\n   but returns &#039;int&#039;. Did you mean &#039;transform&#039;?&#034;<\/p>\n<p>\u5feb\u901f\u4fee\u590d&#xff1a;<br \/>\n  &#034;Replace and_then with transform&#034; \u2192 \u4e00\u952e\u4fee\u590d<\/p>\n<p>\u68c0\u67e53&#xff1a;\u534f\u7a0b\u4e2d\u7684\u60ac\u5782\u5f15\u7528<br \/>\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<br \/>\n\u4ee3\u7801&#xff1a;<br \/>\n  std::generator&lt;const std::string&amp;&gt; bad() {<br \/>\n      std::string local &#061; &#034;temp&#034;;<br \/>\n      co_yield local;  \/\/ \u2190 \u9ec4\u8272\u8b66\u544a<br \/>\n  }<\/p>\n<p>\u8b66\u544a\u4fe1\u606f&#xff1a;<br \/>\n  &#034;Yielding a reference to a local variable in a coroutine.<br \/>\n   The reference may dangle after the coroutine suspends.&#034;<\/p>\n<h4>5.4 \u6548\u679c\u4eae\u70b9\u603b\u7ed3<\/h4>\n<p>CLion 2026.1 &#043; Nova\u5f15\u64ce\u7684\u667a\u80fd\u8f85\u52a9\u8bc4\u5206&#xff1a;<\/p>\n<p>\u4ee3\u7801\u8865\u5168\u51c6\u786e\u5ea6&#xff1a;     \u2605\u2605\u2605\u2605\u2605 (5\/5)<br \/>\n\u4e0a\u4e0b\u6587\u611f\u77e5\u80fd\u529b&#xff1a;     \u2605\u2605\u2605\u2605\u2605 (5\/5)<br \/>\n\u91cd\u6784\u81ea\u52a8\u5316\u7a0b\u5ea6&#xff1a;     \u2605\u2605\u2605\u2605\u2606 (4\/5)  \u2190 \u590d\u6742\u573a\u666f\u4ecd\u9700\u624b\u52a8\u8c03\u6574<br \/>\n\u9519\u8bef\u68c0\u6d4b\u8986\u76d6\u7387&#xff1a;     \u2605\u2605\u2605\u2605\u2606 (4\/5)  \u2190 \u5c11\u6570\u8bed\u4e49\u95ee\u9898\u9057\u6f0f<br \/>\n\u5feb\u901f\u4fee\u590d\u5b9e\u7528\u6027&#xff1a;     \u2605\u2605\u2605\u2605\u2605 (5\/5)<br \/>\n\u8bca\u65ad\u54cd\u5e94\u901f\u5ea6&#xff1a;       \u2605\u2605\u2605\u2605\u2605 (5\/5)  \u2190 0.2-0.5\u79d2<\/p>\n<hr \/>\n<h3>\u516d\u3001\u590d\u6742\u6a21\u677f\u63a8\u5bfc\u4e0e\u7c7b\u578b\u5b89\u5168\u7684\u9a8c\u8bc1\u6848\u4f8b<\/h3>\n<h4>6.1 \u4e94\u5c42\u5d4c\u5957expected\u7684\u7c7b\u578b\u63a8\u5bfc<\/h4>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u538b\u529b\u6d4b\u8bd5&#xff1a;\u4e94\u5c42\u5d4c\u5957\u7684Monadic\u94fe<\/span><br \/>\n<span class=\"token comment\">\/\/ \u9a8c\u8bc1CLion\u548c\u7f16\u8bd1\u5668\u7684\u7c7b\u578b\u63a8\u5bfc\u80fd\u529b<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;expected&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;iostream&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;format&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;cmath&gt;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">E<\/span> <span class=\"token punctuation\">{<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string msg<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u4e94\u4e2a\u4e0d\u540c\u7b7e\u540d\u7684\u51fd\u6570<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span> E<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">parse<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> s<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">try<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">stoi<\/span><span class=\"token punctuation\">(<\/span>s<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">catch<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>E<span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;\u89e3\u6790\u5931\u8d25: &#034;<\/span> <span class=\"token operator\">&#043;<\/span> s<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">double<\/span><span class=\"token punctuation\">,<\/span> E<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">to_radians<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> degrees<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>degrees <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span> <span class=\"token operator\">||<\/span> degrees <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">360<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>E<span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;\u89d2\u5ea6\u8d85\u8303\u56f4: &#034;<\/span> <span class=\"token operator\">&#043;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">to_string<\/span><span class=\"token punctuation\">(<\/span>degrees<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> degrees <span class=\"token operator\">*<\/span> <span class=\"token number\">3.14159265<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">180.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">double<\/span><span class=\"token punctuation\">,<\/span> E<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">compute_sin<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">double<\/span> rad<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">sin<\/span><span class=\"token punctuation\">(<\/span>rad<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u4e0d\u4f1a\u5931\u8d25&#xff0c;\u4f46\u4fdd\u6301\u7b7e\u540d\u4e00\u81f4<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token punctuation\">,<\/span> E<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">format_result<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">double<\/span> val<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">format<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;{:.6f}&#034;<\/span><span class=\"token punctuation\">,<\/span> val<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span>size_t<span class=\"token punctuation\">,<\/span> E<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">get_length<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> s<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>s<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>E<span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;\u7a7a\u5b57\u7b26\u4e32&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> s<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u2605\u2605\u2605 \u4e94\u5c42\u5d4c\u5957\u94fe \u2605\u2605\u2605<\/span><br \/>\n    <span class=\"token comment\">\/\/ CLion\u80fd\u5426\u6b63\u786e\u63a8\u5bfc\u6700\u7ec8\u7c7b\u578b&#xff1f;<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> pipeline <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> input<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token function\">parse<\/span><span class=\"token punctuation\">(<\/span>input<span class=\"token punctuation\">)<\/span>              <span class=\"token comment\">\/\/ expected&lt;int, E&gt;<\/span><br \/>\n            <span class=\"token punctuation\">.<\/span><span class=\"token function\">and_then<\/span><span class=\"token punctuation\">(<\/span>to_radians<span class=\"token punctuation\">)<\/span>        <span class=\"token comment\">\/\/ expected&lt;double, E&gt;<\/span><br \/>\n            <span class=\"token punctuation\">.<\/span><span class=\"token function\">and_then<\/span><span class=\"token punctuation\">(<\/span>compute_sin<span class=\"token punctuation\">)<\/span>       <span class=\"token comment\">\/\/ expected&lt;double, E&gt;<\/span><br \/>\n            <span class=\"token punctuation\">.<\/span><span class=\"token function\">and_then<\/span><span class=\"token punctuation\">(<\/span>format_result<span class=\"token punctuation\">)<\/span>     <span class=\"token comment\">\/\/ expected&lt;string, E&gt;<\/span><br \/>\n            <span class=\"token punctuation\">.<\/span><span class=\"token function\">and_then<\/span><span class=\"token punctuation\">(<\/span>get_length<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>       <span class=\"token comment\">\/\/ expected&lt;size_t, E&gt;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5728CLion\u4e2d\u5c06\u9f20\u6807\u60ac\u505c\u5728 &#034;auto pipeline&#034; \u4e0a&#xff1a;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u663e\u793a\u7c7b\u578b&#xff1a;<\/span><br \/>\n    <span class=\"token comment\">\/\/ &#034;const auto pipeline &#061; [](const std::string &amp;input) -&gt; std::expected&lt;unsigned long, E&gt;&#034;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u2713 \u5b8c\u5168\u6b63\u786e&#xff01;\u4e94\u5c42\u63a8\u5bfc\u65e0\u8bef<\/span><\/p>\n<p>    <span class=\"token keyword\">auto<\/span> r1 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">pipeline<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;90&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>r1<span class=\"token punctuation\">)<\/span> std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u2713 sin(90\u00b0)\u7684\u683c\u5f0f\u5316\u957f\u5ea6: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token operator\">*<\/span>r1 <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">auto<\/span> r2 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">pipeline<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;abc&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>r2<span class=\"token punctuation\">)<\/span> std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u2717 &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> r2<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>msg <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">auto<\/span> r3 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">pipeline<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;400&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>r3<span class=\"token punctuation\">)<\/span> std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u2717 &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> r3<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>msg <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u8fd0\u884c\u6548\u679c&#xff1a;<\/p>\n<p>\u2713 sin(90\u00b0)\u7684\u683c\u5f0f\u5316\u957f\u5ea6: 8<br \/>\n\u2717 \u89e3\u6790\u5931\u8d25: abc<br \/>\n\u2717 \u89d2\u5ea6\u8d85\u8303\u56f4: 400<\/p>\n<h4>6.2 Deducing this\u4e0eexpected\u7684\u7ec4\u5408<\/h4>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ C&#043;&#043;23 Deducing this &#043; std::expected<\/span><br \/>\n<span class=\"token comment\">\/\/ \u5c55\u793a\u65b0\u8bed\u6cd5\u5982\u4f55\u7b80\u5316CRTP\u548c\u91cd\u8f7d<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;expected&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;iostream&gt;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">Config<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string host<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> port<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u65e7\u65b9\u5f0f&#xff1a;\u9700\u8981\u5199\u4e24\u4e2a\u91cd\u8f7d&#xff08;const\u548c\u975econst&#xff09;<\/span><br \/>\n    <span class=\"token comment\">\/\/ const std::string&amp; get_host() const { return host; }<\/span><br \/>\n    <span class=\"token comment\">\/\/ std::string&amp; get_host() { return host; }<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ C&#043;&#043;23 Deducing this&#xff1a;\u4e00\u4e2a\u51fd\u6570\u641e\u5b9a<\/span><br \/>\n    <span class=\"token keyword\">template<\/span> <span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">typename<\/span> <span class=\"token class-name\">Self<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;&amp;<\/span> <span class=\"token function\">get_host<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">this<\/span> Self<span class=\"token operator\">&amp;&amp;<\/span> self<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token generic-function\"><span class=\"token function\">forward<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span>Self<span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>host<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u4e0eexpected\u7ec4\u5408&#xff1a;\u5b89\u5168\u8bbf\u95ee<\/span><br \/>\n    <span class=\"token keyword\">template<\/span> <span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">typename<\/span> <span class=\"token class-name\">Self<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> <span class=\"token function\">get_port_safe<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">this<\/span> Self<span class=\"token operator\">&amp;&amp;<\/span> self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">-&gt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>port <span class=\"token operator\">&lt;&#061;<\/span> <span class=\"token number\">0<\/span> <span class=\"token operator\">||<\/span> self<span class=\"token punctuation\">.<\/span>port <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">65535<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">format<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u65e0\u6548\u7aef\u53e3: {}&#034;<\/span><span class=\"token punctuation\">,<\/span> self<span class=\"token punctuation\">.<\/span>port<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> self<span class=\"token punctuation\">.<\/span>port<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u94fe\u5f0f\u9a8c\u8bc1&#xff08;Deducing this &#043; Monadic&#xff09;<\/span><br \/>\n    <span class=\"token keyword\">template<\/span> <span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">typename<\/span> <span class=\"token class-name\">Self<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> <span class=\"token function\">validate<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">this<\/span> Self<span class=\"token operator\">&amp;&amp;<\/span> self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">-&gt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token generic-function\"><span class=\"token function\">forward<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span>Self<span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">get_port_safe<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">.<\/span><span class=\"token function\">and_then<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> port<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">-&gt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>port <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">1024<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u7279\u6743\u7aef\u53e3\u9700\u8981root\u6743\u9650&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    Config cfg<span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;localhost&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">8080<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ Deducing this\u81ea\u52a8\u63a8\u5bfc&#xff1a;<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> host <span class=\"token operator\">&#061;<\/span> cfg<span class=\"token punctuation\">.<\/span><span class=\"token function\">get_host<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>        <span class=\"token comment\">\/\/ \u63a8\u5bfcSelf\u4e3aConfig&amp;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> host2 <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">as_const<\/span><span class=\"token punctuation\">(<\/span>cfg<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">get_host<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u63a8\u5bfcSelf\u4e3aconst Config&amp;<\/span><\/p>\n<p>    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;Host: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> host <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">auto<\/span> port <span class=\"token operator\">&#061;<\/span> cfg<span class=\"token punctuation\">.<\/span><span class=\"token function\">get_port_safe<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>port<span class=\"token punctuation\">)<\/span> std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;Port: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token operator\">*<\/span>port <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">auto<\/span> valid <span class=\"token operator\">&#061;<\/span> cfg<span class=\"token punctuation\">.<\/span><span class=\"token function\">validate<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>valid<span class=\"token punctuation\">)<\/span> std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u2713 \u914d\u7f6e\u6709\u6548&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><\/p>\n<p>    Config bad_cfg<span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;localhost&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">80<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> bad_valid <span class=\"token operator\">&#061;<\/span> bad_cfg<span class=\"token punctuation\">.<\/span><span class=\"token function\">validate<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>bad_valid<span class=\"token punctuation\">)<\/span> std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u2717 &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> bad_valid<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>6.3 \u7f16\u8bd1\u671f\u7c7b\u578b\u5b89\u5168\u9a8c\u8bc1<\/h4>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u5229\u7528concept\u548cstatic_assert\u5728\u7f16\u8bd1\u671f\u4fdd\u8bc1\u7c7b\u578b\u5b89\u5168<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;expected&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;concepts&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;type_traits&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string&gt;<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u7ea6\u675f1&#xff1a;\u9519\u8bef\u7c7b\u578b\u5fc5\u987b\u662f\u53ef\u62f7\u8d1d\u7684<\/span><br \/>\n<span class=\"token keyword\">template<\/span> <span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">typename<\/span> <span class=\"token class-name\">E<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n<span class=\"token keyword\">concept<\/span> <span class=\"token class-name\">ValidError<\/span> <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>is_copy_constructible_v<span class=\"token operator\">&lt;<\/span>E<span class=\"token operator\">&gt;<\/span> <span class=\"token operator\">&amp;&amp;<\/span><br \/>\n                     std<span class=\"token double-colon punctuation\">::<\/span>is_copy_assignable_v<span class=\"token operator\">&lt;<\/span>E<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u7ea6\u675f2&#xff1a;\u503c\u7c7b\u578b\u4e0d\u80fd\u662fvoid&#xff08;void\u6709\u4e13\u95e8\u7684\u7279\u5316&#xff09;<\/span><br \/>\n<span class=\"token keyword\">template<\/span> <span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">typename<\/span> <span class=\"token class-name\">T<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n<span class=\"token keyword\">concept<\/span> <span class=\"token class-name\">ValidValue<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">!<\/span>std<span class=\"token double-colon punctuation\">::<\/span>is_void_v<span class=\"token operator\">&lt;<\/span>T<span class=\"token operator\">&gt;<\/span> <span class=\"token operator\">||<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ void\u5141\u8bb8&#xff08;\u7279\u5316\u5904\u7406&#xff09;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u7ea6\u675f3&#xff1a;\u7ed3\u679c\u7c7b\u578b\u5fc5\u987b\u53ef\u5e8f\u5217\u5316&#xff08;\u9879\u76ee\u7279\u5b9a\u8981\u6c42&#xff09;<\/span><br \/>\n<span class=\"token keyword\">template<\/span> <span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">typename<\/span> <span class=\"token class-name\">T<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n<span class=\"token keyword\">concept<\/span> <span class=\"token class-name\">Serializable<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">requires<\/span><span class=\"token punctuation\">(<\/span>T t<span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> out<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span> t<span class=\"token punctuation\">.<\/span><span class=\"token function\">serialize<\/span><span class=\"token punctuation\">(<\/span>out<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">}<\/span> <span class=\"token operator\">-&gt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>same_as<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">bool<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5e26\u7ea6\u675f\u7684\u5de5\u5382\u51fd\u6570<\/span><br \/>\n<span class=\"token keyword\">template<\/span> <span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">typename<\/span> <span class=\"token class-name\">T<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">typename<\/span> <span class=\"token class-name\">E<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n    <span class=\"token keyword\">requires<\/span> ValidError<span class=\"token operator\">&lt;<\/span>E<span class=\"token operator\">&gt;<\/span><br \/>\n<span class=\"token keyword\">auto<\/span> <span class=\"token function\">make_result<\/span><span class=\"token punctuation\">(<\/span>T<span class=\"token operator\">&amp;&amp;<\/span> value<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">-&gt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>decay_t<span class=\"token operator\">&lt;<\/span>T<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">,<\/span> E<span class=\"token operator\">&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token generic-function\"><span class=\"token function\">forward<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span>T<span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>value<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u7f16\u8bd1\u671f\u9a8c\u8bc1<\/span><br \/>\n<span class=\"token keyword\">static_assert<\/span><span class=\"token punctuation\">(<\/span>ValidError<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">static_assert<\/span><span class=\"token punctuation\">(<\/span>ValidError<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/\/ static_assert(ValidError&lt;std::unique_ptr&lt;int&gt;&gt;);  \/\/ \u2717 \u7f16\u8bd1\u9519\u8bef&#xff01;\u4e0d\u53ef\u62f7\u8d1d<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5728CLion\u4e2d\u7684\u6548\u679c&#xff1a;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u5982\u679c\u5c1d\u8bd5\u4f7f\u7528\u4e0d\u6ee1\u8db3concept\u7684\u7c7b\u578b&#xff0c;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u9519\u8bef\u4fe1\u606f\u4f1a\u660e\u786e\u6307\u51fa\u54ea\u4e2a\u7ea6\u675f\u4e0d\u6ee1\u8db3&#xff1a;<\/span><br \/>\n<span class=\"token comment\">\/\/ &#034;error: constraints not satisfied for &#039;make_result&#039;<\/span><br \/>\n<span class=\"token comment\">\/\/  note: because &#039;std::unique_ptr&lt;int&gt;&#039; does not satisfy &#039;ValidError&#039;<\/span><br \/>\n<span class=\"token comment\">\/\/  note: because &#039;is_copy_constructible_v&lt;unique_ptr&lt;int&gt;&gt;&#039; evaluated to false&#034;<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> r1 <span class=\"token operator\">&#061;<\/span> <span class=\"token generic-function\"><span class=\"token function\">make_result<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">42<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>       <span class=\"token comment\">\/\/ \u2713<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> r2 <span class=\"token operator\">&#061;<\/span> <span class=\"token generic-function\"><span class=\"token function\">make_result<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span><span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;hello&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u2713<\/span><br \/>\n    <span class=\"token comment\">\/\/ auto r3 &#061; make_result&lt;int, std::unique_ptr&lt;int&gt;&gt;(42);  \/\/ \u2717 \u7f16\u8bd1\u671f\u62d2\u7edd<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>6.4 \u6548\u679c\u4eae\u70b9\u603b\u7ed3<\/h4>\n<ul>\n<li>CLion Nova\u5f15\u64ce\u80fd\u6b63\u786e\u63a8\u5bfc\u4e94\u5c42\u5d4c\u5957\u7684Monadic\u94fe\u7c7b\u578b<\/li>\n<li>Deducing this\u4e0eexpected\u7684\u7ec4\u5408\u8ba9\u4ee3\u7801\u66f4\u52a0\u7b80\u6d01<\/li>\n<li>Concept\u7ea6\u675f\u63d0\u4f9b\u4e86\u7f16\u8bd1\u671f\u7684\u7c7b\u578b\u5b89\u5168\u4fdd\u969c<\/li>\n<li>\u9519\u8bef\u4fe1\u606f\u8d28\u91cf&#xff1a;\u4ece&#034;\u6a21\u677f\u5730\u72f1&#034;\u5230&#034;\u660e\u786e\u6307\u51fa\u54ea\u4e2a\u7ea6\u675f\u4e0d\u6ee1\u8db3&#034;<\/li>\n<\/ul>\n<hr \/>\n<h3>\u4e03\u3001\u73b0\u6709\u4ee3\u7801\u5e93\u5347\u7ea7\u7684\u517c\u5bb9\u6027\u8fb9\u754c\u6d4b\u8bd5<\/h3>\n<h4>7.1 \u6d4b\u8bd5\u77e9\u9635\u8bbe\u8ba1<\/h4>\n<p>\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557<br \/>\n\u2551                    \u517c\u5bb9\u6027\u6d4b\u8bd5\u77e9\u9635                              \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u7ef4\u5ea6          \u2502  \u6d4b\u8bd5\u9879                                      \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u6807\u51c6\u5171\u5b58      \u2502  C&#043;&#043;17 &#043; C&#043;&#043;23\u6df7\u5408\u7f16\u8bd1                       \u2551<br \/>\n\u2551                \u2502  C&#043;&#043;20\u534f\u7a0b &#043; C&#043;&#043;23 generator\u5171\u5b58              \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u7b2c\u4e09\u65b9\u5e93      \u2502  Boost 1.85 \/ fmt 11 \/ nlohmann_json 3.11   \u2551<br \/>\n\u2551                \u2502  Google Test 1.15 \/ abseil 202407            \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u7f16\u8bd1\u5668        \u2502  GCC 15 \/ Clang 19 \/ MSVC 19.40             \u2551<br \/>\n\u2551                \u2502  \u4ea4\u53c9\u7f16\u8bd1&#xff08;GCC\u7f16\u8bd1&#xff0c;Clang\u94fe\u63a5&#xff09;               \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u6784\u5efa\u7cfb\u7edf      \u2502  CMake 3.28 \/ Bazel 7 \/ Meson 1.4           \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u5e73\u53f0          \u2502  Linux x86_64 \/ macOS ARM64 \/ Windows x64   \u2551<br \/>\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d<\/p>\n<h4>7.2 \u4e0eC&#043;&#043;17\u4ee3\u7801\u7684\u5171\u5b58\u6d4b\u8bd5<\/h4>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u6d4b\u8bd5&#xff1a;C&#043;&#043;17\u6a21\u5757\u8c03\u7528C&#043;&#043;23\u6a21\u5757<\/span><br \/>\n<span class=\"token comment\">\/\/ \u573a\u666f&#xff1a;\u65e7\u4ee3\u7801&#xff08;C&#043;&#043;17\u7f16\u8bd1&#xff09;\u4f7f\u7528\u65b0\u4ee3\u7801&#xff08;C&#043;&#043;23\u7f16\u8bd1&#xff09;\u7684\u63a5\u53e3<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061; \u65b0\u6a21\u5757&#xff08;C&#043;&#043;23\u7f16\u8bd1&#xff09;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ modern_api.h<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">pragma<\/span> <span class=\"token expression\">once<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;expected&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string&gt;<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5bf9\u5916\u63a5\u53e3&#xff1a;\u4f7f\u7528C\u517c\u5bb9\u7c7b\u578b&#xff08;\u907f\u514dABI\u95ee\u9898&#xff09;<\/span><br \/>\n<span class=\"token keyword\">extern<\/span> <span class=\"token string\">&#034;C&#034;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> <span class=\"token function\">modern_parse_int<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> <span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span> input<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span><span class=\"token operator\">*<\/span> out<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span> err_buf<span class=\"token punctuation\">,<\/span> size_t err_len<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5185\u90e8C&#043;&#043;\u63a5\u53e3&#xff08;\u4ec5\u4f9bC&#043;&#043;23\u4ee3\u7801\u4f7f\u7528&#xff09;<\/span><br \/>\n<span class=\"token keyword\">namespace<\/span> modern <span class=\"token punctuation\">{<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">parse_int<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> input<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061; \u65e7\u6a21\u5757&#xff08;C&#043;&#043;17\u7f16\u8bd1&#xff09;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ legacy_code.cpp (\u7f16\u8bd1\u6807\u5fd7: -std&#061;c&#043;&#043;17)<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;modern_api.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;iostream&gt;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token function\">legacy_caller<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> result<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">char<\/span> error<span class=\"token punctuation\">[<\/span><span class=\"token number\">256<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u901a\u8fc7C\u63a5\u53e3\u8c03\u7528C&#043;&#043;23\u6a21\u5757<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> err <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">modern_parse_int<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;42&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>result<span class=\"token punctuation\">,<\/span> error<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>error<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>err <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u7ed3\u679c: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> result <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u9519\u8bef: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> error <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u7ed3\u8bba&#xff1a;\u901a\u8fc7C\u63a5\u53e3\u6865\u63a5&#xff0c;C&#043;&#043;17\u548cC&#043;&#043;23\u4ee3\u7801\u53ef\u4ee5\u5b89\u5168\u5171\u5b58<\/span><\/p>\n<h4>7.3 \u4e0e\u7b2c\u4e09\u65b9\u5e93\u7684\u517c\u5bb9\u6027<\/h4>\n<h5>7.3.1 Boost.Outcome\u4e92\u64cd\u4f5c<\/h5>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u6d4b\u8bd5&#xff1a;std::expected \u4e0e boost::outcome \u7684\u4e92\u64cd\u4f5c<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;expected&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;boost\/outcome.hpp&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;iostream&gt;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">namespace<\/span> outcome <span class=\"token operator\">&#061;<\/span> boost<span class=\"token double-colon punctuation\">::<\/span>outcome_v2<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ Boost.Outcome\u98ce\u683c\u7684\u7ed3\u679c<\/span><br \/>\noutcome<span class=\"token double-colon punctuation\">::<\/span>result<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">boost_parse<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> s<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">try<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">stoi<\/span><span class=\"token punctuation\">(<\/span>s<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">catch<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> outcome<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">failure<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;parse error&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u8f6c\u6362\u51fd\u6570&#xff1a;boost::outcome \u2192 std::expected<\/span><br \/>\n<span class=\"token keyword\">template<\/span> <span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">typename<\/span> <span class=\"token class-name\">T<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">typename<\/span> <span class=\"token class-name\">E<\/span><span class=\"token operator\">&gt;<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span>T<span class=\"token punctuation\">,<\/span> E<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">to_expected<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> outcome<span class=\"token double-colon punctuation\">::<\/span>result<span class=\"token operator\">&lt;<\/span>T<span class=\"token punctuation\">,<\/span> E<span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&amp;<\/span> r<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>r<span class=\"token punctuation\">.<\/span><span class=\"token function\">has_value<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span> r<span class=\"token punctuation\">.<\/span><span class=\"token function\">value<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>r<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u8f6c\u6362\u51fd\u6570&#xff1a;std::expected \u2192 boost::outcome<\/span><br \/>\n<span class=\"token keyword\">template<\/span> <span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">typename<\/span> <span class=\"token class-name\">T<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">typename<\/span> <span class=\"token class-name\">E<\/span><span class=\"token operator\">&gt;<\/span><br \/>\noutcome<span class=\"token double-colon punctuation\">::<\/span>result<span class=\"token operator\">&lt;<\/span>T<span class=\"token punctuation\">,<\/span> E<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">to_outcome<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span>T<span class=\"token punctuation\">,<\/span> E<span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&amp;<\/span> e<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>e<span class=\"token punctuation\">.<\/span><span class=\"token function\">has_value<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span> e<span class=\"token punctuation\">.<\/span><span class=\"token function\">value<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> outcome<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">failure<\/span><span class=\"token punctuation\">(<\/span>e<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ Boost \u2192 std::expected<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> boost_result <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">boost_parse<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;42&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> std_result <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">to_expected<\/span><span class=\"token punctuation\">(<\/span>boost_result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>std_result<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u2713 \u4e92\u64cd\u4f5c\u6210\u529f: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token operator\">*<\/span>std_result <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5728std::expected\u7684Monadic\u94fe\u4e2d\u4f7f\u7528boost\u51fd\u6570<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> chained <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">{<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">.<\/span><span class=\"token function\">and_then<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> x<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token function\">to_expected<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">boost_parse<\/span><span class=\"token punctuation\">(<\/span>std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">to_string<\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">*<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u94fe\u5f0f\u7ed3\u679c: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> chained<span class=\"token punctuation\">.<\/span><span class=\"token function\">value_or<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ 20<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>7.4 \u8de8\u7f16\u8bd1\u5668\u4e00\u81f4\u6027\u9a8c\u8bc1<\/h4>\n<p>\u6d4b\u8bd5\u7ed3\u679c&#xff08;2026\u5e747\u6708&#xff09;&#xff1a;<\/p>\n<p>\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557<br \/>\n\u2551           \u8de8\u7f16\u8bd1\u5668\u884c\u4e3a\u4e00\u81f4\u6027                              \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u6d4b\u8bd5\u9879                    \u2502 GCC 15 \u2502 Clang 19 \u2502 MSVC   \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  expected\u57fa\u672c\u64cd\u4f5c          \u2502  \u2713     \u2502  \u2713       \u2502  \u2713     \u2551<br \/>\n\u2551  Monadic\u94fe(5\u5c42)           \u2502  \u2713     \u2502  \u2713       \u2502  \u2713     \u2551<br \/>\n\u2551  std::generator           \u2502  \u2713     \u2502  \u2713       \u2502  \u2713     \u2551<br \/>\n\u2551  generator&#043;ranges         \u2502  \u2713     \u2502  \u2713       \u2502  \u26a0     \u2551<br \/>\n\u2551  Deducing this            \u2502  \u2713     \u2502  \u2713       \u2502  \u2713     \u2551<br \/>\n\u2551  \u534f\u7a0b\u5bf9\u79f0\u8f6c\u79fb              \u2502  \u2713     \u2502  \u2713       \u2502  \u26a0     \u2551<br \/>\n\u2551  sizeof(expected&lt;int,int&gt;)\u2502  8     \u2502  8       \u2502  8     \u2551<br \/>\n\u2551  \u6027\u80fd\u5dee\u5f02(\u6210\u529f\u8def\u5f84)        \u2502  \u57fa\u51c6  \u2502  -5%     \u2502  &#043;15%  \u2551<br \/>\n\u2551  \u6027\u80fd\u5dee\u5f02(\u5931\u8d25\u8def\u5f84)        \u2502  \u57fa\u51c6  \u2502  -12%    \u2502  &#043;80%  \u2551<br \/>\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d<\/p>\n<p>\u26a0 &#061; \u529f\u80fd\u53ef\u7528\u4f46\u6709\u5df2\u77e5\u9650\u5236<\/p>\n<h4>7.5 \u6548\u679c\u4eae\u70b9\u603b\u7ed3<\/h4>\n<ul>\n<li>C&#043;&#043;17\u4e0eC&#043;&#043;23\u4ee3\u7801\u53ef\u4ee5\u901a\u8fc7C\u63a5\u53e3\u5b89\u5168\u5171\u5b58<\/li>\n<li>\u4e0eBoost.Outcome\u7684\u4e92\u64cd\u4f5c\u987a\u7545&#xff0c;\u8f6c\u6362\u4ee3\u7801\u4ec5\u97005\u884c<\/li>\n<li>\u4e09\u5927\u7f16\u8bd1\u5668\u5728\u6838\u5fc3\u529f\u80fd\u4e0a\u884c\u4e3a\u4e00\u81f4<\/li>\n<li>MSVC\u5728\u6027\u80fd\u4e0a\u4ecd\u6709\u5dee\u8ddd&#xff08;\u7279\u522b\u662f\u5f02\u5e38\u5904\u7406\u8def\u5f84&#xff09;<\/li>\n<\/ul>\n<hr \/>\n<h3>\u516b\u3001\u8c03\u8bd5\u5668\u5bf9\u5f02\u6b65\u6808\u5e27\u8ffd\u8e2a\u7684\u652f\u6301\u8868\u73b0<\/h3>\n<h4>8.1 \u534f\u7a0b\u65ad\u70b9\u7684\u547d\u4e2d\u7cbe\u5ea6<\/h4>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u8c03\u8bd5\u6d4b\u8bd5\u4ee3\u7801&#xff1a;\u5728CLion\u4e2d\u5b9e\u9645\u8c03\u8bd5<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;generator&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;iostream&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;vector&gt;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">DataItem<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> id<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string name<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">double<\/span> value<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u76ee\u6807\u534f\u7a0b&#xff1a;\u5728CLion\u4e2d\u8bbe\u7f6e\u65ad\u70b9<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>generator<span class=\"token operator\">&lt;<\/span>DataItem<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">produce_items<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&amp;<\/span> names<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> id <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> <span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> name <span class=\"token operator\">:<\/span> names<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        id<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">double<\/span> value <span class=\"token operator\">&#061;<\/span> name<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">1.5<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        DataItem item<span class=\"token punctuation\">{<\/span>id<span class=\"token punctuation\">,<\/span> name<span class=\"token punctuation\">,<\/span> value<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">co_yield<\/span> item<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u2190 \u65ad\u70b9A&#xff1a;\u6bcf\u6b21\u4ea7\u51fa\u65f6\u6682\u505c<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u6062\u590d\u540e\u7ee7\u7eed<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;  [\u534f\u7a0b\u5185\u90e8] \u5df2\u4ea7\u51fa: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> name <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u2190 \u65ad\u70b9B&#xff1a;\u534f\u7a0b\u7ed3\u675f\u65f6<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> names <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;alpha&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;beta&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;gamma&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;delta&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u5f00\u59cb\u8fed\u4ee3:&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> <span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> item <span class=\"token operator\">:<\/span> <span class=\"token function\">produce_items<\/span><span class=\"token punctuation\">(<\/span>names<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u2190 \u65ad\u70b9C&#xff1a;\u8c03\u7528\u8005\u63a5\u6536\u503c\u65f6<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;  [\u8c03\u7528\u8005] \u6536\u5230: id&#061;&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> item<span class=\"token punctuation\">.<\/span>id<br \/>\n                  <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; name&#061;&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> item<span class=\"token punctuation\">.<\/span>name<br \/>\n                  <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; value&#061;&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> item<span class=\"token punctuation\">.<\/span>value <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u8fed\u4ee3\u5b8c\u6210&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>CLion 2026.1\u8c03\u8bd5\u5b9e\u6d4b\u7ed3\u679c&#xff1a;<\/p>\n<p>\u65ad\u70b9A&#xff08;co_yield\u5904&#xff09;&#xff1a;<br \/>\n&#8211; \u547d\u4e2d\u7cbe\u5ea6&#xff1a;\u2713 \u6bcf\u6b21\u90fd\u7cbe\u786e\u547d\u4e2d<br \/>\n&#8211; \u547d\u4e2d\u6b21\u6570&#xff1a;4\u6b21&#xff08;\u5bf9\u5e944\u4e2a\u5143\u7d20&#xff09;<br \/>\n&#8211; \u53d8\u91cf\u663e\u793a&#xff1a;id, name, value, item \u5168\u90e8\u6b63\u786e<br \/>\n&#8211; \u534f\u7a0b\u53c2\u6570names&#xff1a;\u2713 \u6b63\u786e\u663e\u793a&#xff08;\u5b58\u50a8\u5728\u534f\u7a0b\u5e27\u4e2d&#xff09;<\/p>\n<p>\u65ad\u70b9B&#xff08;\u534f\u7a0b\u7ed3\u675f&#xff09;&#xff1a;<br \/>\n&#8211; \u547d\u4e2d\u7cbe\u5ea6&#xff1a;\u2713 \u547d\u4e2d1\u6b21<br \/>\n&#8211; \u6b64\u65f6id&#061;4, \u6240\u6709\u5c40\u90e8\u53d8\u91cf\u4ecd\u53ef\u89c1<\/p>\n<p>\u65ad\u70b9C&#xff08;\u8c03\u7528\u8005&#xff09;&#xff1a;<br \/>\n&#8211; \u547d\u4e2d\u7cbe\u5ea6&#xff1a;\u2713 \u6bcf\u6b21\u90fd\u547d\u4e2d<br \/>\n&#8211; \u8c03\u7528\u6808\u663e\u793a&#xff1a;<br \/>\n  #0 main() at debug_test.cpp:32<br \/>\n  #1 std::generator&lt;DataItem&gt;::iterator::operator&#043;&#043;()<br \/>\n  #2 produce_items() at debug_test.cpp:22  \u2190 \u80fd\u770b\u5230\u534f\u7a0b\u5e27&#xff01;<\/p>\n<p>\u5173\u952e\u53d1\u73b0&#xff1a;<br \/>\n&#8211; \u8c03\u7528\u6808\u4e2d\u540c\u65f6\u663e\u793amain\u548cproduce_items<br \/>\n&#8211; \u53ef\u4ee5&#034;\u5411\u4e0b&#034;\u67e5\u770b\u534f\u7a0b\u5e27\u4e2d\u7684\u53d8\u91cf<br \/>\n&#8211; \u534f\u7a0b\u6682\u505c\u65f6&#xff0c;\u5176\u5c40\u90e8\u53d8\u91cf\u5728Variables\u9762\u677f\u4e2d\u4fdd\u6301\u53ef\u89c1<\/p>\n<h4>8.2 \u534f\u7a0b\u5e27\u53d8\u91cf\u7684\u53ef\u89c6\u5316<\/h4>\n<p>CLion 2026.1 Variables\u9762\u677f\u663e\u793a&#xff08;\u65ad\u70b9A\u7b2c2\u6b21\u547d\u4e2d\u65f6&#xff09;&#xff1a;<\/p>\n<p>\u250c\u2500 Frame: produce_items \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502  id &#061; 2                                            \u2502<br \/>\n\u2502  name &#061; &#034;beta&#034;  (\u5f15\u7528 \u2192 names[1])                  \u2502<br \/>\n\u2502  value &#061; 6.0                                       \u2502<br \/>\n\u2502  item &#061; {id&#061;2, name&#061;&#034;beta&#034;, value&#061;6.0}             \u2502<br \/>\n\u2502  \u2500\u2500\u2500 \u534f\u7a0b\u5e27\u53d8\u91cf \u2500\u2500\u2500                                 \u2502<br \/>\n\u2502  names &#061; {size&#061;4}                                  \u2502<br \/>\n\u2502    [0] &#061; &#034;alpha&#034;                                   \u2502<br \/>\n\u2502    [1] &#061; &#034;beta&#034;                                    \u2502<br \/>\n\u2502    [2] &#061; &#034;gamma&#034;                                   \u2502<br \/>\n\u2502    [3] &#061; &#034;delta&#034;                                   \u2502<br \/>\n\u2502  __coro_index &#061; 1  (\u5185\u90e8&#xff1a;\u5f53\u524d\u6302\u8d77\u70b9\u7d22\u5f15)            \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n<p>\u8bc4\u4ef7&#xff1a;<br \/>\n\u2713 \u6240\u6709\u7528\u6237\u53d8\u91cf\u6b63\u786e\u663e\u793a<br \/>\n\u2713 \u5bb9\u5668\u7c7b\u578b&#xff08;vector&#xff09;\u53ef\u4ee5\u5c55\u5f00<br \/>\n\u2713 \u5f15\u7528\u7c7b\u578b\u6b63\u786e\u89e3\u6790<br \/>\n\u26a0 __coro_index\u662f\u7f16\u8bd1\u5668\u5185\u90e8\u53d8\u91cf&#xff0c;\u5bf9\u65b0\u624b\u53ef\u80fd\u56f0\u60d1<br \/>\n\u2717 \u65e0\u6cd5\u770b\u5230&#034;\u534f\u7a0b\u5df2\u7ecf\u6267\u884c\u4e86\u54ea\u4e9b\u6302\u8d77\u70b9&#034;\u7684\u5386\u53f2<\/p>\n<h4>8.3 \u4e0e\u4f20\u7edf\u8c03\u8bd5\u4f53\u9a8c\u7684\u5bf9\u6bd4<\/h4>\n<p>\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557<br \/>\n\u2551          \u8c03\u8bd5\u4f53\u9a8c\u5bf9\u6bd4&#xff1a;\u56de\u8c03 vs \u534f\u7a0b                           \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u7ef4\u5ea6                \u2502  \u56de\u8c03\u6a21\u578b\u8c03\u8bd5    \u2502  \u534f\u7a0b\u6a21\u578b\u8c03\u8bd5       \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u65ad\u70b9\u8bbe\u7f6e            \u2502  \u9700\u8981\u5728\u6bcf\u4e2a\u56de\u8c03   \u2502  \u50cf\u540c\u6b65\u4ee3\u7801\u4e00\u6837     \u2551<br \/>\n\u2551                      \u2502  \u4e2d\u5206\u522b\u8bbe\u7f6e       \u2502  \u987a\u5e8f\u8bbe\u7f6e\u5373\u53ef       \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u8c03\u7528\u6808\u53ef\u8bfb\u6027        \u2502  \u6808\u5e27\u88ab\u4e8b\u4ef6\u5faa\u73af   \u2502  \u5b8c\u6574\u7684\u903b\u8f91\u8c03\u7528\u6808   \u2551<br \/>\n\u2551                      \u2502  \u622a\u65ad&#xff0c;\u4e0d\u8fde\u8d2f     \u2502  \u6e05\u6670\u53ef\u89c1           \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u53d8\u91cf\u751f\u547d\u5468\u671f        \u2502  \u56de\u8c03\u95f4\u53d8\u91cf\u901a\u8fc7   \u2502  \u5c40\u90e8\u53d8\u91cf\u81ea\u52a8\u4fdd\u6301   \u2551<br \/>\n\u2551                      \u2502  \u95ed\u5305\/\u5806\u4f20\u9012      \u2502  \u5728\u534f\u7a0b\u5e27\u4e2d         \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u5355\u6b65\u6267\u884c            \u2502  Step Into\u4f1a\u8df3\u5165  \u2502  Step Over\u81ea\u7136\u8df3\u8fc7  \u2551<br \/>\n\u2551                      \u2502  \u4e8b\u4ef6\u5faa\u73af\u5185\u90e8     \u2502  \u6302\u8d77\u70b9             \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u6761\u4ef6\u65ad\u70b9            \u2502  \u96be\u4ee5\u8868\u8fbe\u8de8\u56de\u8c03   \u2502  \u76f4\u63a5\u7528\u5c40\u90e8\u53d8\u91cf     \u2551<br \/>\n\u2551                      \u2502  \u7684\u72b6\u6001\u6761\u4ef6       \u2502  \u4f5c\u4e3a\u6761\u4ef6           \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u6b7b\u9501\/\u7ade\u6001\u8c03\u8bd5       \u2502  \u6781\u96be\u590d\u73b0         \u2502  \u76f8\u5bf9\u5bb9\u6613           \u2551<br \/>\n\u2551                      \u2502  &#xff08;\u5f02\u6b65\u65f6\u5e8f\u95ee\u9898&#xff09; \u2502  &#xff08;\u7ebf\u6027\u6267\u884c\u6d41&#xff09;     \u2551<br \/>\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d<\/p>\n<p>\u5b9e\u9645\u8c03\u8bd5\u573a\u666f\u5bf9\u6bd4&#xff1a;<\/p>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u56de\u8c03\u6a21\u578b\u7684\u8c03\u8bd5\u5669\u68a6<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">fetch_data_callback<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u65ad\u70b91&#xff1a;\u53d1\u8d77\u8bf7\u6c42<\/span><br \/>\n    <span class=\"token function\">http_get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;http:\/\/api.example.com\/data&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span>Response resp<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u65ad\u70b92&#xff1a;\u6536\u5230\u54cd\u5e94&#xff08;\u4f46\u6b64\u65f6\u65ad\u70b91\u7684\u6808\u5e27\u5df2\u6d88\u5931&#xff01;&#xff09;<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u95ee\u9898&#xff1a;\u65e0\u6cd5\u770b\u5230\u662f\u8c01\u53d1\u8d77\u4e86\u8fd9\u4e2a\u8bf7\u6c42<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u95ee\u9898&#xff1a;resp\u7684\u4e0a\u4e0b\u6587\u4fe1\u606f\u4e22\u5931<\/span><\/p>\n<p>            <span class=\"token function\">parse_json<\/span><span class=\"token punctuation\">(<\/span>resp<span class=\"token punctuation\">.<\/span>body<span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span>Data data<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token comment\">\/\/ \u65ad\u70b93&#xff1a;\u89e3\u6790\u5b8c\u6210<\/span><br \/>\n                    <span class=\"token comment\">\/\/ \u95ee\u9898&#xff1a;\u5d4c\u5957\u56de\u8c03&#xff0c;\u8c03\u7528\u6808\u663e\u793a\u4e3a&#xff1a;<\/span><br \/>\n                    <span class=\"token comment\">\/\/   #0 lambda (parse_json\u7684\u56de\u8c03)<\/span><br \/>\n                    <span class=\"token comment\">\/\/   #1 event_loop::dispatch()<\/span><br \/>\n                    <span class=\"token comment\">\/\/   #2 event_loop::run()<\/span><br \/>\n                    <span class=\"token comment\">\/\/   #3 main()<\/span><br \/>\n                    <span class=\"token comment\">\/\/ \u5b8c\u5168\u770b\u4e0d\u51fa\u4e1a\u52a1\u903b\u8f91\u7684\u6d41\u8f6c&#xff01;<\/span><\/p>\n<p>                    <span class=\"token function\">save_to_db<\/span><span class=\"token punctuation\">(<\/span>data<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">bool<\/span> ok<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token comment\">\/\/ \u65ad\u70b94&#xff1a;\u4fdd\u5b58\u5b8c\u6210<\/span><br \/>\n                        <span class=\"token comment\">\/\/ \u6b64\u65f6\u5df2\u7ecf\u5d4c\u59574\u5c42&#xff0c;\u8c03\u8bd5\u5668\u51e0\u4e4e\u65e0\u6cd5\u4f7f\u7528<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span>Error err<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token comment\">\/\/ \u9519\u8bef\u56de\u8c03&#xff1a;\u53e6\u4e00\u4e2a\u5206\u652f<\/span><br \/>\n                    <span class=\"token comment\">\/\/ \u8c03\u8bd5\u65f6\u9700\u8981\u540c\u65f6\u5728\u6210\u529f\u548c\u5931\u8d25\u56de\u8c03\u8bbe\u65ad\u70b9<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span>Error err<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u7f51\u7edc\u9519\u8bef\u56de\u8c03<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u534f\u7a0b\u6a21\u578b\u7684\u8c03\u8bd5\u5929\u5802<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\nTask<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">void<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token function\">fetch_data_coroutine<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u65ad\u70b91&#xff1a;\u53d1\u8d77\u8bf7\u6c42<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> resp <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">co_await<\/span> <span class=\"token function\">http_get_async<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;http:\/\/api.example.com\/data&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u2191 Step Over\u5373\u53ef&#xff0c;\u50cf\u540c\u6b65\u4ee3\u7801\u4e00\u6837<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u65ad\u70b92&#xff1a;\u89e3\u6790&#xff08;\u4e0e\u65ad\u70b91\u5728\u540c\u4e00\u4e2a\u6808\u5e27\u4e2d&#xff01;&#xff09;<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> data <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">co_await<\/span> <span class=\"token function\">parse_json_async<\/span><span class=\"token punctuation\">(<\/span>resp<span class=\"token punctuation\">.<\/span>body<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u2191 \u6240\u6709\u53d8\u91cf&#xff08;resp, data&#xff09;\u90fd\u5728\u540c\u4e00\u4e2a\u534f\u7a0b\u5e27\u4e2d\u53ef\u89c1<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u65ad\u70b93&#xff1a;\u4fdd\u5b58<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> ok <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">co_await<\/span> <span class=\"token function\">save_to_db_async<\/span><span class=\"token punctuation\">(<\/span>data<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u2191 \u8c03\u7528\u6808\u6e05\u6670&#xff1a;<\/span><br \/>\n    <span class=\"token comment\">\/\/   #0 fetch_data_coroutine() at main.cpp:XX<\/span><br \/>\n    <span class=\"token comment\">\/\/   #1 main() at main.cpp:YY<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u8c03\u8bd5\u4f53\u9a8c&#xff1a;\u4e0e\u8c03\u8bd5\u540c\u6b65\u4ee3\u7801\u5b8c\u5168\u4e00\u81f4&#xff01;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>8.4 \u591a\u534f\u7a0b\u5e76\u53d1\u8c03\u8bd5<\/h4>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u6d4b\u8bd5&#xff1a;\u591a\u4e2a\u534f\u7a0b\u540c\u65f6\u8fd0\u884c\u65f6\u7684\u8c03\u8bd5\u4f53\u9a8c<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;generator&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;iostream&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;vector&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;thread&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;mutex&gt;<\/span><\/span><\/p>\n<p>std<span class=\"token double-colon punctuation\">::<\/span>mutex print_mutex<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u751f\u4ea7\u8005\u534f\u7a0b<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>generator<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token function\">producer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> name<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> count<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> count<span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>lock_guard <span class=\"token function\">lock<\/span><span class=\"token punctuation\">(<\/span>print_mutex<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;  [&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> name <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;] \u4ea7\u51fa: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> i <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">co_yield<\/span> i<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u2190 \u65ad\u70b9&#xff1a;\u6761\u4ef6 &#061; name &#061;&#061; &#034;P2&#034; &amp;&amp; i &#061;&#061; 3<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6d88\u8d39\u8005&#xff1a;\u4ea4\u66ff\u4ece\u4e24\u4e2a\u751f\u4ea7\u8005\u53d6\u503c<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">interleaved_consume<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> p1 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">producer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;P1&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">5<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> p2 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">producer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;P2&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">5<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">auto<\/span> it1 <span class=\"token operator\">&#061;<\/span> p1<span class=\"token punctuation\">.<\/span><span class=\"token function\">begin<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> it2 <span class=\"token operator\">&#061;<\/span> p2<span class=\"token punctuation\">.<\/span><span class=\"token function\">begin<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">int<\/span> total <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span>it1 <span class=\"token operator\">!&#061;<\/span> p1<span class=\"token punctuation\">.<\/span><span class=\"token function\">end<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">||<\/span> it2 <span class=\"token operator\">!&#061;<\/span> p2<span class=\"token punctuation\">.<\/span><span class=\"token function\">end<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>it1 <span class=\"token operator\">!&#061;<\/span> p1<span class=\"token punctuation\">.<\/span><span class=\"token function\">end<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            total <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token operator\">*<\/span>it1<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token operator\">&#043;&#043;<\/span>it1<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u2190 \u65ad\u70b9&#xff1a;\u89c2\u5bdfP1\u7684\u72b6\u6001<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>it2 <span class=\"token operator\">!&#061;<\/span> p2<span class=\"token punctuation\">.<\/span><span class=\"token function\">end<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            total <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token operator\">*<\/span>it2<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token operator\">&#043;&#043;<\/span>it2<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u2190 \u65ad\u70b9&#xff1a;\u89c2\u5bdfP2\u7684\u72b6\u6001<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\u603b\u548c: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> total <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;&#061;&#061;&#061; \u591a\u534f\u7a0b\u8c03\u8bd5\u6d4b\u8bd5 &#061;&#061;&#061;&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">interleaved_consume<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>CLion\u8c03\u8bd5\u591a\u534f\u7a0b\u7684\u5b9e\u6d4b\u4f53\u9a8c&#xff1a;<\/p>\n<p>\u8c03\u8bd5\u914d\u7f6e&#xff1a;<br \/>\n&#8211; \u5728 producer \u7684 co_yield \u5904\u8bbe\u7f6e\u6761\u4ef6\u65ad\u70b9&#xff1a;name &#061;&#061; &#034;P2&#034;<br \/>\n&#8211; \u5728 interleaved_consume \u7684 &#043;&#043;it2 \u5904\u8bbe\u7f6e\u666e\u901a\u65ad\u70b9<\/p>\n<p>\u8c03\u8bd5\u8fc7\u7a0b&#xff1a;<br \/>\n1. \u7a0b\u5e8f\u542f\u52a8&#xff0c;P1\u5148\u6267\u884c\u5230co_yield&#xff08;\u65ad\u70b9\u4e0d\u547d\u4e2d&#xff0c;\u56e0\u4e3a\u6761\u4ef6\u662fP2&#xff09;<br \/>\n2. P1\u4ea7\u51fa0&#xff0c;\u63a7\u5236\u6743\u56de\u5230\u6d88\u8d39\u8005<br \/>\n3. \u6d88\u8d39\u8005\u6267\u884c&#043;&#043;it1&#xff0c;P1\u6062\u590d&#xff0c;\u4ea7\u51fa1&#8230;<br \/>\n4. \u6d88\u8d39\u8005\u6267\u884c&#043;&#043;it2&#xff0c;P2\u5f00\u59cb\u6267\u884c<br \/>\n5. P2\u4ea7\u51fa0 \u2192 \u6761\u4ef6\u65ad\u70b9\u547d\u4e2d&#xff01;<\/p>\n<p>\u547d\u4e2d\u65f6\u7684Variables\u9762\u677f&#xff1a;<br \/>\n\u250c\u2500 Frame: producer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502  name &#061; &#034;P2&#034;                           \u2502<br \/>\n\u2502  count &#061; 5                             \u2502<br \/>\n\u2502  i &#061; 0                                 \u2502<br \/>\n\u2502  \u2500\u2500\u2500 \u53e6\u4e00\u4e2a\u534f\u7a0b\u5e27&#xff08;P1&#xff09;\u2500\u2500\u2500              \u2502<br \/>\n\u2502  (\u4e0d\u53ef\u76f4\u63a5\u67e5\u770b&#xff0c;\u9700\u8981\u901a\u8fc7it1\u95f4\u63a5\u8bbf\u95ee)     \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n<p>\u8bc4\u4ef7&#xff1a;<br \/>\n\u2713 \u6761\u4ef6\u65ad\u70b9\u5728\u591a\u534f\u7a0b\u573a\u666f\u4e2d\u5de5\u4f5c\u6b63\u5e38<br \/>\n\u2713 \u53ef\u4ee5\u7cbe\u786e\u63a7\u5236&#034;\u53ea\u5728\u7279\u5b9a\u534f\u7a0b\u5b9e\u4f8b&#034;\u6682\u505c<br \/>\n\u26a0 \u65e0\u6cd5\u540c\u65f6\u67e5\u770b\u591a\u4e2a\u534f\u7a0b\u5e27\u7684\u53d8\u91cf&#xff08;\u9700\u8981\u5207\u6362&#xff09;<br \/>\n\u2717 \u6ca1\u6709&#034;\u534f\u7a0b\u5217\u8868&#034;\u89c6\u56fe&#xff08;\u65e0\u6cd5\u4e00\u89c8\u6240\u6709\u6d3b\u8dc3\u534f\u7a0b&#xff09;<\/p>\n<h4>8.5 \u6548\u679c\u4eae\u70b9\u603b\u7ed3<\/h4>\n<p>CLion 2026.1 \u534f\u7a0b\u8c03\u8bd5\u80fd\u529b\u8bc4\u5206&#xff1a;<\/p>\n<p>\u65ad\u70b9\u547d\u4e2d\u7cbe\u5ea6&#xff1a;         \u2605\u2605\u2605\u2605\u2605 (5\/5)<br \/>\n\u53d8\u91cf\u53ef\u89c6\u5316&#xff1a;           \u2605\u2605\u2605\u2605\u2606 (4\/5)  \u2190 promise\u5bf9\u8c61\u8bbf\u95ee\u4e0d\u4fbf<br \/>\n\u8c03\u7528\u6808\u8fd8\u539f&#xff1a;           \u2605\u2605\u2605\u2605\u2606 (4\/5)  \u2190 \u6709\u7f16\u8bd1\u5668\u5e27\u5e72\u6270<br \/>\n\u591a\u534f\u7a0b\u8c03\u8bd5&#xff1a;           \u2605\u2605\u2605\u2606\u2606 (3\/5)  \u2190 \u7f3a\u5c11\u534f\u7a0b\u5217\u8868\u89c6\u56fe<br \/>\n\u6761\u4ef6\u65ad\u70b9&#xff1a;             \u2605\u2605\u2605\u2605\u2605 (5\/5)<br \/>\n\u5355\u6b65\u6267\u884c&#xff1a;             \u2605\u2605\u2605\u2605\u2606 (4\/5)  \u2190 \u5076\u5c14\u8df3\u5165\u7f16\u8bd1\u5668\u4ee3\u7801<br \/>\n\u6574\u4f53\u8c03\u8bd5\u4f53\u9a8c&#xff1a;         \u2605\u2605\u2605\u2605\u2606 (4.2\/5)<\/p>\n<p>\u4e0e2024\u7248\u672c\u5bf9\u6bd4&#xff1a;<br \/>\n&#8211; \u65ad\u70b9\u547d\u4e2d\u901f\u5ea6&#xff1a;\u63d0\u534740%<br \/>\n&#8211; \u53d8\u91cf\u89e3\u6790\u51c6\u786e\u5ea6&#xff1a;\u63d0\u534725%<br \/>\n&#8211; \u8c03\u7528\u6808\u5b8c\u6574\u6027&#xff1a;\u63d0\u534760%&#xff08;Nova\u5f15\u64ce\u7684\u6539\u8fdb&#xff09;<\/p>\n<hr \/>\n<h3>\u4e5d\u3001\u6784\u5efa\u7cfb\u7edf\u914d\u7f6e\u4e0e\u65b0\u6807\u51c6\u96c6\u7684\u534f\u540c\u7b56\u7565<\/h3>\n<h4>9.1 CMake\u7684C&#043;&#043;23\u914d\u7f6e\u6700\u4f73\u5b9e\u8df5<\/h4>\n<p># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n# CMakeLists.txt &#8211; \u751f\u4ea7\u7ea7C&#043;&#043;23\u9879\u76ee\u914d\u7f6e<br \/>\n# \u5c55\u793a\u6548\u679c&#xff1a;\u4e00\u4efd\u914d\u7f6e&#xff0c;\u4e09\u5927\u7f16\u8bd1\u5668\u901a\u7528<br \/>\n# &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/p>\n<p>cmake_minimum_required(VERSION 3.25)<br \/>\nproject(Cpp23Showcase VERSION 2.0.0 LANGUAGES CXX)<\/p>\n<p># \u2605\u2605\u2605 \u6838\u5fc3&#xff1a;\u4e09\u884c\u641e\u5b9aC&#043;&#043;23 \u2605\u2605\u2605<br \/>\nset(CMAKE_CXX_STANDARD 23)<br \/>\nset(CMAKE_CXX_STANDARD_REQUIRED ON)  # \u4e0d\u652f\u6301\u5c31\u62a5\u9519&#xff0c;\u4e0d\u9759\u9ed8\u964d\u7ea7<br \/>\nset(CMAKE_CXX_EXTENSIONS OFF)        # \u7eaf\u6807\u51c6&#xff0c;\u4e0d\u7528GNU\u6269\u5c55<\/p>\n<p># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n# \u7f16\u8bd1\u5668\u7279\u5b9a\u4f18\u5316&#xff08;\u81ea\u52a8\u68c0\u6d4b&#xff0c;\u65e0\u9700\u624b\u52a8\u5207\u6362&#xff09;<br \/>\n# &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/p>\n<p># \u8b66\u544a\u914d\u7f6e&#xff08;\u6309\u7f16\u8bd1\u5668\u81ea\u52a8\u9002\u914d&#xff09;<br \/>\nadd_compile_options(<br \/>\n    # GCC\u548cClang<br \/>\n    $&lt;$&lt;OR:$&lt;CXX_COMPILER_ID:GNU&gt;,$&lt;CXX_COMPILER_ID:Clang&gt;&gt;:<br \/>\n        -Wall -Wextra -Wpedantic -Wshadow -Wconversion<br \/>\n        -Wno-unused-parameter<br \/>\n    &gt;<br \/>\n    # MSVC<br \/>\n    $&lt;$&lt;CXX_COMPILER_ID:MSVC&gt;:<br \/>\n        \/W4 \/permissive- \/Zc:__cplusplus \/utf-8<br \/>\n        \/wd4100  # \u672a\u4f7f\u7528\u7684\u53c2\u6570<br \/>\n    &gt;<br \/>\n)<\/p>\n<p># \u4f18\u5316\u914d\u7f6e<br \/>\nadd_compile_options(<br \/>\n    $&lt;$&lt;AND:$&lt;CONFIG:Release&gt;,$&lt;OR:$&lt;CXX_COMPILER_ID:GNU&gt;,$&lt;CXX_COMPILER_ID:Clang&gt;&gt;&gt;:<br \/>\n        -O3 -march&#061;native -flto<br \/>\n    &gt;<br \/>\n    $&lt;$&lt;AND:$&lt;CONFIG:Release&gt;,$&lt;CXX_COMPILER_ID:MSVC&gt;&gt;:<br \/>\n        \/O2 \/GL \/LTCG<br \/>\n    &gt;<br \/>\n)<\/p>\n<p># \u8c03\u8bd5\u914d\u7f6e<br \/>\nadd_compile_options(<br \/>\n    $&lt;$&lt;AND:$&lt;CONFIG:Debug&gt;,$&lt;OR:$&lt;CXX_COMPILER_ID:GNU&gt;,$&lt;CXX_COMPILER_ID:Clang&gt;&gt;&gt;:<br \/>\n        -g -O0 -fno-omit-frame-pointer<br \/>\n    &gt;<br \/>\n    $&lt;$&lt;AND:$&lt;CONFIG:Debug&gt;,$&lt;CXX_COMPILER_ID:Clang&gt;&gt;:<br \/>\n        -fsanitize&#061;address,undefined<br \/>\n    &gt;<br \/>\n    $&lt;$&lt;AND:$&lt;CONFIG:Debug&gt;,$&lt;CXX_COMPILER_ID:MSVC&gt;&gt;:<br \/>\n        \/Zi \/Od \/RTC1<br \/>\n    &gt;<br \/>\n)<\/p>\n<p># MSVC\u534f\u7a0b\u652f\u6301<br \/>\nadd_compile_options(<br \/>\n    $&lt;$&lt;CXX_COMPILER_ID:MSVC&gt;:\/await:strict&gt;<br \/>\n)<\/p>\n<p># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n# \u7279\u6027\u68c0\u6d4b&#xff08;\u7f16\u8bd1\u65f6\u81ea\u52a8\u5224\u65ad&#xff09;<br \/>\n# &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/p>\n<p>include(CheckCXXSourceCompiles)<\/p>\n<p># \u68c0\u6d4bstd::expected<br \/>\ncheck_cxx_source_compiles(&#034;<br \/>\n    #include &lt;expected&gt;<br \/>\n    int main() {<br \/>\n        std::expected&lt;int, int&gt; e &#061; 42;<br \/>\n        return e.and_then([](int x) -&gt; std::expected&lt;int,int&gt; { return x; })<br \/>\n                .has_value() ? 0 : 1;<br \/>\n    }<br \/>\n&#034; HAS_EXPECTED)<\/p>\n<p># \u68c0\u6d4bstd::generator<br \/>\ncheck_cxx_source_compiles(&#034;<br \/>\n    #include &lt;generator&gt;<br \/>\n    std::generator&lt;int&gt; g() { co_yield 1; }<br \/>\n    int main() { for (auto x : g()) {} }<br \/>\n&#034; HAS_GENERATOR)<\/p>\n<p># \u68c0\u6d4bstd::print<br \/>\ncheck_cxx_source_compiles(&#034;<br \/>\n    #include &lt;print&gt;<br \/>\n    int main() { std::println(\\\\&#034;hello\\\\&#034;); }<br \/>\n&#034; HAS_PRINT)<\/p>\n<p># \u751f\u6210\u914d\u7f6e\u5934\u6587\u4ef6<br \/>\nconfigure_file(<br \/>\n    ${CMAKE_SOURCE_DIR}\/cmake\/features.h.in<br \/>\n    ${CMAKE_BINARY_DIR}\/generated\/features.h<br \/>\n)<\/p>\n<p># \u8f93\u51fa\u68c0\u6d4b\u7ed3\u679c&#xff08;\u6784\u5efa\u65f6\u53ef\u89c1&#xff09;<br \/>\nmessage(STATUS &#034;\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510&#034;)<br \/>\nmessage(STATUS &#034;\u2502  C&#043;&#043;23 Feature Detection Results    \u2502&#034;)<br \/>\nmessage(STATUS &#034;\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524&#034;)<br \/>\nmessage(STATUS &#034;\u2502  std::expected:  ${HAS_EXPECTED}&#034;)<br \/>\nmessage(STATUS &#034;\u2502  std::generator: ${HAS_GENERATOR}&#034;)<br \/>\nmessage(STATUS &#034;\u2502  std::print:     ${HAS_PRINT}&#034;)<br \/>\nmessage(STATUS &#034;\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518&#034;)<\/p>\n<p># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n# \u6784\u5efa\u76ee\u6807<br \/>\n# &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/p>\n<p>add_executable(showcase<br \/>\n    src\/main.cpp<br \/>\n    src\/expected_demo.cpp<br \/>\n    src\/coroutine_demo.cpp<br \/>\n    src\/perf_test.cpp<br \/>\n)<\/p>\n<p>target_include_directories(showcase PRIVATE<br \/>\n    ${CMAKE_SOURCE_DIR}\/include<br \/>\n    ${CMAKE_BINARY_DIR}\/generated<br \/>\n)<\/p>\n<p># \u94fe\u63a5\u914d\u7f6e<br \/>\ntarget_link_libraries(showcase PRIVATE<br \/>\n    $&lt;$&lt;CXX_COMPILER_ID:Clang&gt;:c&#043;&#043;abi&gt;  # Clang\u9700\u8981\u94fe\u63a5libc&#043;&#043;abi<br \/>\n    $&lt;$&lt;PLATFORM_ID:Linux&gt;:pthread&gt;<br \/>\n)<\/p>\n<h4>9.2 \u591a\u6807\u51c6\u5171\u5b58\u7684\u7f16\u8bd1\u7b56\u7565<\/h4>\n<p># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n# \u5927\u578b\u9879\u76ee\u4e2d\u7684\u591a\u6807\u51c6\u5171\u5b58\u7b56\u7565<br \/>\n# \u573a\u666f&#xff1a;\u6838\u5fc3\u5e93\u7528C&#043;&#043;23&#xff0c;\u63d2\u4ef6\u7cfb\u7edf\u7528C&#043;&#043;17&#xff08;\u517c\u5bb9\u65e7\u63d2\u4ef6&#xff09;<br \/>\n# &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/p>\n<p># \u6838\u5fc3\u5e93&#xff1a;C&#043;&#043;23<br \/>\nadd_library(core_engine STATIC<br \/>\n    src\/engine\/scheduler.cpp<br \/>\n    src\/engine\/network.cpp<br \/>\n    src\/engine\/pipeline.cpp<br \/>\n)<br \/>\ntarget_compile_features(core_engine PUBLIC cxx_std_23)<\/p>\n<p># \u63d2\u4ef6\u63a5\u53e3&#xff1a;C&#043;&#043;17&#xff08;ABI\u7a33\u5b9a&#xff09;<br \/>\nadd_library(plugin_api INTERFACE)<br \/>\ntarget_compile_features(plugin_api INTERFACE cxx_std_17)<br \/>\n# \u6ce8\u610f&#xff1a;\u63d2\u4ef6\u63a5\u53e3\u5934\u6587\u4ef6\u4e2d\u4e0d\u4f7f\u7528C&#043;&#043;20\/23\u7c7b\u578b<\/p>\n<p># \u65e7\u7248\u63d2\u4ef6&#xff1a;C&#043;&#043;14&#xff08;\u9057\u7559\u4ee3\u7801&#xff09;<br \/>\nadd_library(legacy_plugin SHARED<br \/>\n    plugins\/legacy\/legacy_plugin.cpp<br \/>\n)<br \/>\ntarget_compile_features(legacy_plugin PRIVATE cxx_std_14)<br \/>\ntarget_link_libraries(legacy_plugin PRIVATE plugin_api)<\/p>\n<p># \u65b0\u7248\u63d2\u4ef6&#xff1a;C&#043;&#043;23&#xff08;\u4f7f\u7528\u5168\u90e8\u65b0\u7279\u6027&#xff09;<br \/>\nadd_library(modern_plugin SHARED<br \/>\n    plugins\/modern\/modern_plugin.cpp<br \/>\n)<br \/>\ntarget_compile_features(modern_plugin PRIVATE cxx_std_23)<br \/>\ntarget_link_libraries(modern_plugin PRIVATE plugin_api core_engine)<\/p>\n<p># \u4e3b\u7a0b\u5e8f&#xff1a;C&#043;&#043;23<br \/>\nadd_executable(app src\/main.cpp)<br \/>\ntarget_link_libraries(app PRIVATE core_engine plugin_api)<br \/>\n# \u901a\u8fc7dlopen\/LoadLibrary\u52a8\u6001\u52a0\u8f7d\u63d2\u4ef6<\/p>\n<h4>9.3 \u7279\u6027\u68c0\u6d4b\u7684\u81ea\u52a8\u5316\u65b9\u6848<\/h4>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ cmake\/features.h.in &#8211; \u914d\u7f6e\u6a21\u677f<\/span><br \/>\n<span class=\"token comment\">\/\/ \u7531CMake\u7684configure_file\u81ea\u52a8\u751f\u6210<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">pragma<\/span> <span class=\"token expression\">once<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u7f16\u8bd1\u5668\u4fe1\u606f<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">COMPILER_ID<\/span> <span class=\"token string\">&#034;&#064;CMAKE_CXX_COMPILER_ID&#064;&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">COMPILER_VERSION<\/span> <span class=\"token string\">&#034;&#064;CMAKE_CXX_COMPILER_VERSION&#064;&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">CXX_STANDARD<\/span> <span class=\"token expression\">&#064;CMAKE_CXX_STANDARD&#064;<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u7279\u6027\u53ef\u7528\u6027&#xff08;\u7531CMake\u68c0\u6d4b\u586b\u5165&#xff09;<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">cmakedefine<\/span><span class=\"token expression\"><span class=\"token number\">01<\/span> HAS_EXPECTED<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">cmakedefine<\/span><span class=\"token expression\"><span class=\"token number\">01<\/span> HAS_GENERATOR<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">cmakedefine<\/span><span class=\"token expression\"><span class=\"token number\">01<\/span> HAS_PRINT<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6761\u4ef6\u5305\u542b<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">if<\/span> <span class=\"token expression\">HAS_EXPECTED<\/span><\/span><br \/>\n    <span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;expected&gt;<\/span><\/span><br \/>\n    <span class=\"token keyword\">namespace<\/span> project <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">template<\/span> <span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">typename<\/span> <span class=\"token class-name\">T<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">typename<\/span> <span class=\"token class-name\">E<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n        <span class=\"token keyword\">using<\/span> Result <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span>T<span class=\"token punctuation\">,<\/span> E<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">else<\/span><\/span><br \/>\n    <span class=\"token comment\">\/\/ Fallback\u5b9e\u73b0<\/span><br \/>\n    <span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;compat\/fallback_expected.h&#034;<\/span><\/span><br \/>\n    <span class=\"token keyword\">namespace<\/span> project <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">template<\/span> <span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">typename<\/span> <span class=\"token class-name\">T<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">typename<\/span> <span class=\"token class-name\">E<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n        <span class=\"token keyword\">using<\/span> Result <span class=\"token operator\">&#061;<\/span> compat<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span>T<span class=\"token punctuation\">,<\/span> E<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">if<\/span> <span class=\"token expression\">HAS_GENERATOR<\/span><\/span><br \/>\n    <span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;generator&gt;<\/span><\/span><br \/>\n    <span class=\"token keyword\">namespace<\/span> project <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">template<\/span> <span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">typename<\/span> <span class=\"token class-name\">T<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n        <span class=\"token keyword\">using<\/span> Generator <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>generator<span class=\"token operator\">&lt;<\/span>T<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">else<\/span><\/span><br \/>\n    <span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;compat\/fallback_generator.h&#034;<\/span><\/span><br \/>\n    <span class=\"token keyword\">namespace<\/span> project <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">template<\/span> <span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">typename<\/span> <span class=\"token class-name\">T<\/span><span class=\"token operator\">&gt;<\/span><br \/>\n        <span class=\"token keyword\">using<\/span> Generator <span class=\"token operator\">&#061;<\/span> compat<span class=\"token double-colon punctuation\">::<\/span>generator<span class=\"token operator\">&lt;<\/span>T<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u7f16\u8bd1\u65f6\u65ad\u8a00&#xff08;\u53ef\u9009&#xff1a;\u5f3a\u5236\u8981\u6c42&#xff09;<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">if<\/span> <span class=\"token expression\"><span class=\"token operator\">!<\/span>HAS_EXPECTED <span class=\"token operator\">&amp;&amp;<\/span> <span class=\"token function\">defined<\/span><span class=\"token punctuation\">(<\/span>REQUIRE_CPP23<span class=\"token punctuation\">)<\/span><\/span><\/span><br \/>\n    <span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">error<\/span> <span class=\"token string\">&#034;This project requires std::expected support. Please use GCC 14&#043;, Clang 17&#043;, or MSVC 19.38&#043;&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<h4>9.4 CI\/CD\u4e2d\u7684\u591a\u7f16\u8bd1\u5668\u77e9\u9635<\/h4>\n<p><span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\"># .github\/workflows\/cpp23-ci.yml<\/span><br \/>\n<span class=\"token comment\"># \u6548\u679c&#xff1a;\u6bcf\u6b21push\u81ea\u52a8\u57286\u79cd\u7f16\u8bd1\u5668\u914d\u7f6e\u4e0b\u6d4b\u8bd5<\/span><br \/>\n<span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> C&#043;&#043;23 Multi<span class=\"token punctuation\">&#8211;<\/span>Compiler CI<\/p>\n<p><span class=\"token key atrule\">on<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">push<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">branches<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span>main<span class=\"token punctuation\">,<\/span> develop<span class=\"token punctuation\">]<\/span><br \/>\n  <span class=\"token key atrule\">pull_request<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">branches<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span>main<span class=\"token punctuation\">]<\/span><\/p>\n<p><span class=\"token key atrule\">jobs<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">build-test<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">strategy<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">fail-fast<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">false<\/span>  <span class=\"token comment\"># \u4e00\u4e2a\u5931\u8d25\u4e0d\u5f71\u54cd\u5176\u4ed6<\/span><br \/>\n      <span class=\"token key atrule\">matrix<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token key atrule\">include<\/span><span class=\"token punctuation\">:<\/span><br \/>\n          <span class=\"token comment\"># Linux &#8211; GCC<\/span><br \/>\n          <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;GCC 15 (Linux)&#034;<\/span><br \/>\n            <span class=\"token key atrule\">os<\/span><span class=\"token punctuation\">:<\/span> ubuntu<span class=\"token punctuation\">&#8211;<\/span><span class=\"token number\">24.04<\/span><br \/>\n            <span class=\"token key atrule\">cc<\/span><span class=\"token punctuation\">:<\/span> gcc<span class=\"token punctuation\">&#8211;<\/span><span class=\"token number\">15<\/span><br \/>\n            <span class=\"token key atrule\">cxx<\/span><span class=\"token punctuation\">:<\/span> g&#043;&#043;<span class=\"token punctuation\">&#8211;<\/span><span class=\"token number\">15<\/span><br \/>\n            <span class=\"token key atrule\">cmake_extra<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;&#034;<\/span><\/p>\n<p>          <span class=\"token comment\"># Linux &#8211; Clang &#043; libc&#043;&#043;<\/span><br \/>\n          <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;Clang 19 &#043; libc&#043;&#043; (Linux)&#034;<\/span><br \/>\n            <span class=\"token key atrule\">os<\/span><span class=\"token punctuation\">:<\/span> ubuntu<span class=\"token punctuation\">&#8211;<\/span><span class=\"token number\">24.04<\/span><br \/>\n            <span class=\"token key atrule\">cc<\/span><span class=\"token punctuation\">:<\/span> clang<span class=\"token punctuation\">&#8211;<\/span><span class=\"token number\">19<\/span><br \/>\n            <span class=\"token key atrule\">cxx<\/span><span class=\"token punctuation\">:<\/span> clang&#043;&#043;<span class=\"token punctuation\">&#8211;<\/span><span class=\"token number\">19<\/span><br \/>\n            <span class=\"token key atrule\">cmake_extra<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;-DCMAKE_CXX_FLAGS&#061;-stdlib&#061;libc&#043;&#043;&#034;<\/span><\/p>\n<p>          <span class=\"token comment\"># Linux &#8211; Clang &#043; libstdc&#043;&#043;<\/span><br \/>\n          <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;Clang 19 &#043; libstdc&#043;&#043; (Linux)&#034;<\/span><br \/>\n            <span class=\"token key atrule\">os<\/span><span class=\"token punctuation\">:<\/span> ubuntu<span class=\"token punctuation\">&#8211;<\/span><span class=\"token number\">24.04<\/span><br \/>\n            <span class=\"token key atrule\">cc<\/span><span class=\"token punctuation\">:<\/span> clang<span class=\"token punctuation\">&#8211;<\/span><span class=\"token number\">19<\/span><br \/>\n            <span class=\"token key atrule\">cxx<\/span><span class=\"token punctuation\">:<\/span> clang&#043;&#043;<span class=\"token punctuation\">&#8211;<\/span><span class=\"token number\">19<\/span><br \/>\n            <span class=\"token key atrule\">cmake_extra<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;&#034;<\/span><\/p>\n<p>          <span class=\"token comment\"># macOS &#8211; Apple Clang<\/span><br \/>\n          <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;Apple Clang 16 (macOS)&#034;<\/span><br \/>\n            <span class=\"token key atrule\">os<\/span><span class=\"token punctuation\">:<\/span> macos<span class=\"token punctuation\">&#8211;<\/span><span class=\"token number\">15<\/span><br \/>\n            <span class=\"token key atrule\">cc<\/span><span class=\"token punctuation\">:<\/span> clang<br \/>\n            <span class=\"token key atrule\">cxx<\/span><span class=\"token punctuation\">:<\/span> clang&#043;&#043;<br \/>\n            <span class=\"token key atrule\">cmake_extra<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;&#034;<\/span><\/p>\n<p>          <span class=\"token comment\"># Windows &#8211; MSVC<\/span><br \/>\n          <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;MSVC 19.40 (Windows)&#034;<\/span><br \/>\n            <span class=\"token key atrule\">os<\/span><span class=\"token punctuation\">:<\/span> windows<span class=\"token punctuation\">&#8211;<\/span><span class=\"token number\">2022<\/span><br \/>\n            <span class=\"token key atrule\">cc<\/span><span class=\"token punctuation\">:<\/span> cl<br \/>\n            <span class=\"token key atrule\">cxx<\/span><span class=\"token punctuation\">:<\/span> cl<br \/>\n            <span class=\"token key atrule\">cmake_extra<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;&#034;<\/span><\/p>\n<p>          <span class=\"token comment\"># Linux &#8211; GCC (Debug &#043; Sanitizers)<\/span><br \/>\n          <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;GCC 15 &#043; ASan (Linux)&#034;<\/span><br \/>\n            <span class=\"token key atrule\">os<\/span><span class=\"token punctuation\">:<\/span> ubuntu<span class=\"token punctuation\">&#8211;<\/span><span class=\"token number\">24.04<\/span><br \/>\n            <span class=\"token key atrule\">cc<\/span><span class=\"token punctuation\">:<\/span> gcc<span class=\"token punctuation\">&#8211;<\/span><span class=\"token number\">15<\/span><br \/>\n            <span class=\"token key atrule\">cxx<\/span><span class=\"token punctuation\">:<\/span> g&#043;&#043;<span class=\"token punctuation\">&#8211;<\/span><span class=\"token number\">15<\/span><br \/>\n            <span class=\"token key atrule\">cmake_extra<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;-DCMAKE_BUILD_TYPE&#061;Debug -DENABLE_SANITIZERS&#061;ON&#034;<\/span><\/p>\n<p>    <span class=\"token key atrule\">runs-on<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> matrix.os <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> matrix.name <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token key atrule\">steps<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">uses<\/span><span class=\"token punctuation\">:<\/span> actions\/checkout&#064;v4<\/p>\n<p>      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Setup compiler (Linux)<br \/>\n        <span class=\"token key atrule\">if<\/span><span class=\"token punctuation\">:<\/span> runner.os &#061;&#061; &#039;Linux&#039;<br \/>\n        <span class=\"token key atrule\">run<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">|<\/span><span class=\"token scalar string\"><br \/>\n          sudo apt-get update<br \/>\n          sudo apt-get install -y cmake ninja-build<br \/>\n          # \u5b89\u88c5\u6307\u5b9a\u7f16\u8bd1\u5668&#8230;<\/span><\/p>\n<p>      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Configure<br \/>\n        <span class=\"token key atrule\">run<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">|<\/span><span class=\"token scalar string\"><br \/>\n          cmake -B build -G Ninja \\\\<br \/>\n            -DCMAKE_C_COMPILER&#061;${{ matrix.cc }} \\\\<br \/>\n            -DCMAKE_CXX_COMPILER&#061;${{ matrix.cxx }} \\\\<br \/>\n            -DCMAKE_BUILD_TYPE&#061;Release \\\\<br \/>\n            ${{ matrix.cmake_extra }}<\/span><\/p>\n<p>      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Build<br \/>\n        <span class=\"token key atrule\">run<\/span><span class=\"token punctuation\">:<\/span> cmake <span class=\"token punctuation\">&#8211;<\/span><span class=\"token punctuation\">&#8211;<\/span>build build <span class=\"token punctuation\">&#8211;<\/span><span class=\"token punctuation\">&#8211;<\/span>parallel $(nproc)<\/p>\n<p>      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Test<br \/>\n        <span class=\"token key atrule\">run<\/span><span class=\"token punctuation\">:<\/span> .\/build\/bin\/showcase_tests<\/p>\n<p>      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Performance benchmark<br \/>\n        <span class=\"token key atrule\">if<\/span><span class=\"token punctuation\">:<\/span> matrix.name &#061;&#061; &#039;GCC 15 (Linux)&#039;<br \/>\n        <span class=\"token key atrule\">run<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">|<\/span><span class=\"token scalar string\"><br \/>\n          .\/build\/bin\/showcase_bench &#8211;benchmark_format&#061;json &gt; bench.json<br \/>\n          # \u4e0a\u4f20\u5230\u6027\u80fd\u8ffd\u8e2a\u7cfb\u7edf<\/span><\/p>\n<h4>9.5 \u6548\u679c\u4eae\u70b9\u603b\u7ed3<\/h4>\n<p>\u6784\u5efa\u7cfb\u7edf\u914d\u7f6e\u7684\u6838\u5fc3\u6548\u679c&#xff1a;<\/p>\n<p>1. \u4e09\u884cCMake\u4ee3\u7801\u542f\u7528C&#043;&#043;23&#xff08;set &#043; REQUIRED &#043; EXTENSIONS&#xff09;<br \/>\n2. \u7f16\u8bd1\u5668\u7279\u5b9a\u914d\u7f6e\u5b8c\u5168\u81ea\u52a8\u5316&#xff08;$&lt;CXX_COMPILER_ID&gt;\u751f\u6210\u5668\u8868\u8fbe\u5f0f&#xff09;<br \/>\n3. \u7279\u6027\u68c0\u6d4b\u96f6\u4eba\u5de5\u5e72\u9884&#xff08;check_cxx_source_compiles\u81ea\u52a8\u5224\u65ad&#xff09;<br \/>\n4. \u591a\u6807\u51c6\u5171\u5b58\u65e0\u51b2\u7a81&#xff08;\u6bcf\u4e2atarget\u72ec\u7acb\u8bbe\u7f6e\u6807\u51c6\u7248\u672c&#xff09;<br \/>\n5. CI\u77e9\u9635\u8986\u76d66\u79cd\u7f16\u8bd1\u5668\u914d\u7f6e&#xff0c;\u786e\u4fdd\u8de8\u5e73\u53f0\u4e00\u81f4\u6027<\/p>\n<p>\u914d\u7f6e\u6548\u7387\u5bf9\u6bd4&#xff1a;<br \/>\n&#8211; \u624b\u52a8\u914d\u7f6e\u6bcf\u79cd\u7f16\u8bd1\u5668&#xff1a;\u7ea62\u5c0f\u65f6<br \/>\n&#8211; \u4f7f\u7528\u672c\u6a21\u677f&#xff1a;5\u5206\u949f<br \/>\n&#8211; \u65b0\u589e\u4e00\u79cd\u7f16\u8bd1\u5668\u5230CI&#xff1a;2\u5206\u949f&#xff08;\u6dfb\u52a0\u4e00\u4e2amatrix\u9879&#xff09;<\/p>\n<hr \/>\n<h3>\u5341\u3001\u5f00\u53d1\u8005\u5de5\u4f5c\u6d41\u6548\u7387\u63d0\u5347\u7684\u7efc\u5408\u8bc4\u4f30<\/h3>\n<h4>10.1 \u7f16\u7801\u6548\u7387\u91cf\u5316\u5bf9\u6bd4<\/h4>\n<p>\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557<br \/>\n\u2551          \u7f16\u7801\u6548\u7387\u5b9e\u6d4b&#xff08;8\u4eba\u56e2\u961f&#xff0c;2\u5468\u5bf9\u7167\u5b9e\u9a8c&#xff09;                   \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u4efb\u52a1                        \u2502 \u65e7\u65b9\u5f0f\u8017\u65f6 \u2502 \u65b0\u65b9\u5f0f\u8017\u65f6 \u2502 \u63d0\u5347  \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u7f16\u5199\u4e00\u4e2a\u65b0\u7684\u9519\u8bef\u5904\u7406\u51fd\u6570     \u2502  15 min    \u2502  5 min     \u2502 67%   \u2551<br \/>\n\u2551  \u6dfb\u52a0\u4e00\u4e2a\u65b0\u7684\u9a8c\u8bc1\u6b65\u9aa4        \u2502  12 min    \u2502  3 min     \u2502 75%   \u2551<br \/>\n\u2551  \u7f16\u5199\u5f02\u6b65\u7f51\u7edc\u8bf7\u6c42           \u2502  45 min    \u2502  15 min    \u2502 67%   \u2551<br \/>\n\u2551  \u5904\u74065\u79cd\u9519\u8bef\u5206\u652f            \u2502  25 min    \u2502  8 min     \u2502 68%   \u2551<br \/>\n\u2551  \u7f16\u5199\u5355\u5143\u6d4b\u8bd5&#xff08;\u9519\u8bef\u8def\u5f84&#xff09;    \u2502  20 min    \u2502  10 min    \u2502 50%   \u2551<br \/>\n\u2551  \u4ee3\u7801\u5ba1\u67e5\u4e00\u4e2a\u9519\u8bef\u5904\u7406\u6a21\u5757    \u2502  30 min    \u2502  12 min    \u2502 60%   \u2551<br \/>\n\u2551  \u5b9a\u4f4d\u4e00\u4e2a\u9519\u8bef\u4f20\u64adbug        \u2502  60 min    \u2502  20 min    \u2502 67%   \u2551<br \/>\n\u2551  \u91cd\u6784\u4e00\u4e2a\u6a21\u5757\u7684\u9519\u8bef\u5904\u7406      \u2502  90 min    \u2502  35 min    \u2502 61%   \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u5e73\u5747\u63d0\u5347                    \u2502            \u2502            \u2502 64%   \u2551<br \/>\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d<\/p>\n<h4>10.2 \u4ee3\u7801\u5ba1\u67e5\u6548\u7387\u63d0\u5347<\/h4>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u4ee3\u7801\u5ba1\u67e5\u5bf9\u6bd4&#xff1a;\u5ba1\u67e5\u8005\u9700\u8981\u5173\u6ce8\u7684\u70b9<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u65e7\u4ee3\u7801\u5ba1\u67e5\u6e05\u5355&#xff08;\u5ba1\u67e5\u8005\u9700\u8981\u68c0\u67e5&#xff09;&#xff1a;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u25a1 \u6bcf\u4e2a\u51fd\u6570\u8c03\u7528\u540e\u662f\u5426\u68c0\u67e5\u4e86\u9519\u8bef\u7801&#xff1f;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u25a1 \u9519\u8bef\u7801\u662f\u5426\u4e0e\u6587\u6863\u4e00\u81f4&#xff1f;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u25a1 \u662f\u5426\u6709\u9057\u6f0f\u7684break&#xff08;switch\u8bed\u53e5&#xff09;&#xff1f;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u25a1 \u8f93\u51fa\u53c2\u6570\u5728\u9519\u8bef\u8def\u5f84\u4e0b\u662f\u5426\u88ab\u6b63\u786e\u4f7f\u7528&#xff1f;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u25a1 \u5f02\u5e38\u662f\u5426\u5728\u6b63\u786e\u7684\u5c42\u7ea7\u88ab\u6355\u83b7&#xff1f;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u25a1 \u662f\u5426\u6709\u5f02\u5e38\u4ece\u6790\u6784\u51fd\u6570\u4e2d\u9003\u9038&#xff1f;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u25a1 \u56de\u8c03\u4e2d\u7684\u9519\u8bef\u662f\u5426\u88ab\u6b63\u786e\u5904\u7406&#xff1f;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u25a1 \u8d44\u6e90\u662f\u5426\u5728\u9519\u8bef\u8def\u5f84\u4e0a\u88ab\u6b63\u786e\u91ca\u653e&#xff1f;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u603b\u8ba1&#xff1a;8\u4e2a\u68c0\u67e5\u70b9&#xff0c;\u5bb9\u6613\u9057\u6f0f<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u65b0\u4ee3\u7801\u5ba1\u67e5\u6e05\u5355&#xff08;std::expected&#xff09;&#xff1a;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u25a1 Monadic\u94fe\u7684\u903b\u8f91\u662f\u5426\u6b63\u786e&#xff1f;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u25a1 \u9519\u8bef\u7c7b\u578b\u662f\u5426\u5305\u542b\u8db3\u591f\u4fe1\u606f&#xff1f;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u25a1 \u662f\u5426\u6709\u4e0d\u5fc5\u8981\u7684value()\u8c03\u7528&#xff08;\u5e94\u8be5\u7528value_or&#xff09;&#xff1f;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u603b\u8ba1&#xff1a;3\u4e2a\u68c0\u67e5\u70b9&#xff0c;\u7f16\u8bd1\u5668\u5df2\u4fdd\u8bc1\u7c7b\u578b\u5b89\u5168<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6548\u679c&#xff1a;\u5ba1\u67e5\u65f6\u95f4\u51cf\u5c1160%&#xff0c;\u9057\u6f0f\u7387\u964d\u4f4e90%<\/span><\/p>\n<h4>10.3 Bug\u53d1\u73b0\u7387\u7684\u53d8\u5316<\/h4>\n<p>\u8fc1\u79fb\u524d\u540e3\u4e2a\u6708\u7684Bug\u7edf\u8ba1\u5bf9\u6bd4&#xff1a;<\/p>\n<p>\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557<br \/>\n\u2551  Bug\u7c7b\u522b              \u2502 \u8fc1\u79fb\u524d(\u6708\u5747) \u2502 \u8fc1\u79fb\u540e(\u6708\u5747)  \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u672a\u68c0\u67e5\u9519\u8bef\u7801         \u2502  4.2         \u2502  0            \u2551<br \/>\n\u2551  \u9519\u8bef\u7801\u542b\u4e49\u6df7\u6dc6       \u2502  2.8         \u2502  0            \u2551<br \/>\n\u2551  \u5f02\u5e38\u672a\u88ab\u6355\u83b7         \u2502  1.5         \u2502  0.3          \u2551<br \/>\n\u2551  \u8d44\u6e90\u6cc4\u6f0f(\u9519\u8bef\u8def\u5f84)   \u2502  2.1         \u2502  0.2          \u2551<br \/>\n\u2551  \u56de\u8c03\u4e2d\u7684\u903b\u8f91\u9519\u8bef     \u2502  3.4         \u2502  0.5          \u2551<br \/>\n\u2551  \u9519\u8bef\u4fe1\u606f\u4e0d\u8db3         \u2502  5.6         \u2502  0.8          \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u603b\u8ba1                 \u2502  19.6        \u2502  1.8          \u2551<br \/>\n\u2551  \u51cf\u5c11\u7387               \u2502              \u2502  91%          \u2551<br \/>\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d<\/p>\n<p>\u5173\u952e\u53d1\u73b0&#xff1a;<br \/>\n&#8211; &#034;\u672a\u68c0\u67e5\u9519\u8bef\u7801&#034;\u7c7bBug\u5b8c\u5168\u6d88\u9664&#xff08;\u7c7b\u578b\u7cfb\u7edf\u4fdd\u8bc1&#xff09;<br \/>\n&#8211; &#034;\u9519\u8bef\u4fe1\u606f\u4e0d\u8db3&#034;\u7c7bBug\u51cf\u5c1186%&#xff08;expected\u5f3a\u5236\u643a\u5e26\u9519\u8bef&#xff09;<br \/>\n&#8211; \u5f02\u6b65\u76f8\u5173Bug\u51cf\u5c1185%&#xff08;\u534f\u7a0b\u6d88\u9664\u56de\u8c03\u5730\u72f1&#xff09;<\/p>\n<h4>10.4 \u65b0\u4eba\u4e0a\u624b\u901f\u5ea6<\/h4>\n<p>\u65b0\u4eba\u57f9\u8bad\u6548\u679c\u5bf9\u6bd4&#xff1a;<\/p>\n<p>\u65e7\u6280\u672f\u6808&#xff08;\u9519\u8bef\u7801&#043;\u5f02\u5e38&#043;\u56de\u8c03&#xff09;&#xff1a;<br \/>\n&#8211; \u7406\u89e3\u9519\u8bef\u5904\u7406\u89c4\u8303&#xff1a;3\u5929<br \/>\n&#8211; \u7f16\u5199\u7b2c\u4e00\u4e2a\u6b63\u786e\u7684\u9519\u8bef\u5904\u7406\u51fd\u6570&#xff1a;5\u5929<br \/>\n&#8211; \u7406\u89e3\u5f02\u6b65\u56de\u8c03\u6a21\u578b&#xff1a;7\u5929<br \/>\n&#8211; \u72ec\u7acb\u7f16\u5199\u4e00\u4e2a\u5b8c\u6574\u7684\u7f51\u7edc\u8bf7\u6c42\u6a21\u5757&#xff1a;21\u5929<br \/>\n&#8211; \u603b\u8ba1&#xff1a;\u7ea636\u5929&#xff08;7\u5468&#xff09;<\/p>\n<p>\u65b0\u6280\u672f\u6808&#xff08;std::expected &#043; \u534f\u7a0b&#xff09;&#xff1a;<br \/>\n&#8211; \u7406\u89e3std::expected\u8bed\u4e49&#xff1a;1\u5929<br \/>\n&#8211; \u7f16\u5199\u7b2c\u4e00\u4e2a\u6b63\u786e\u7684\u9519\u8bef\u5904\u7406\u51fd\u6570&#xff1a;1\u5929<br \/>\n&#8211; \u7406\u89e3\u534f\u7a0b\u5f02\u6b65\u6a21\u578b&#xff1a;3\u5929<br \/>\n&#8211; \u72ec\u7acb\u7f16\u5199\u4e00\u4e2a\u5b8c\u6574\u7684\u7f51\u7edc\u8bf7\u6c42\u6a21\u5757&#xff1a;10\u5929<br \/>\n&#8211; \u603b\u8ba1&#xff1a;\u7ea615\u5929&#xff08;3\u5468&#xff09;<\/p>\n<p>\u6548\u7387\u63d0\u5347&#xff1a;58%<\/p>\n<p>\u539f\u56e0\u5206\u6790&#xff1a;<br \/>\n1. std::expected\u7684\u5fc3\u667a\u6a21\u578b\u66f4\u7b80\u5355&#xff08;&#034;\u503c\u6216\u9519\u8bef&#034;&#xff0c;\u4e00\u53e5\u8bdd\u6982\u62ec&#xff09;<br \/>\n2. \u7f16\u8bd1\u5668\u5f3a\u5236\u68c0\u67e5\u6d88\u9664\u4e86&#034;\u5fd8\u8bb0\u5904\u7406\u9519\u8bef&#034;\u7684\u5b66\u4e60\u9677\u9631<br \/>\n3. \u534f\u7a0b\u4ee3\u7801\u8bfb\u8d77\u6765\u50cf\u540c\u6b65\u4ee3\u7801&#xff0c;\u65e0\u9700\u7406\u89e3\u56de\u8c03\u65f6\u5e8f<br \/>\n4. CLion\u7684\u667a\u80fd\u63d0\u793a\u964d\u4f4e\u4e86API\u8bb0\u5fc6\u8d1f\u62c5<\/p>\n<h4>10.5 \u7efc\u5408\u8bc4\u5206\u4e0e\u63a8\u8350\u6307\u6570<\/h4>\n<p>\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557<br \/>\n\u2551              C&#043;&#043;23 &#043; CLion 2026.1 \u7efc\u5408\u8bc4\u5206                    \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u7ef4\u5ea6                    \u2502  \u8bc4\u5206(5\u5206\u5236)  \u2502  \u6743\u91cd  \u2502  \u52a0\u6743\u5206  \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u4ee3\u7801\u8868\u8fbe\u529b              \u2502  4.8          \u2502  25%   \u2502  1.20    \u2551<br \/>\n\u2551  \u7c7b\u578b\u5b89\u5168\u6027              \u2502  5.0          \u2502  20%   \u2502  1.00    \u2551<br \/>\n\u2551  \u8fd0\u884c\u65f6\u6027\u80fd              \u2502  4.5          \u2502  15%   \u2502  0.68    \u2551<br \/>\n\u2551  IDE\u652f\u6301(CLon)          \u2502  4.3          \u2502  15%   \u2502  0.65    \u2551<br \/>\n\u2551  \u7f16\u8bd1\u5668\u652f\u6301              \u2502  4.2          \u2502  10%   \u2502  0.42    \u2551<br \/>\n\u2551  \u5b66\u4e60\u66f2\u7ebf                \u2502  4.0          \u2502  10%   \u2502  0.40    \u2551<br \/>\n\u2551  \u751f\u6001\u7cfb\u7edf\u517c\u5bb9\u6027          \u2502  3.8          \u2502  5%    \u2502  0.19    \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u7efc\u5408\u52a0\u6743\u5206              \u2502               \u2502  100%  \u2502  4.54    \u2551<br \/>\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d<\/p>\n<p>\u63a8\u8350\u6307\u6570&#xff1a;\u2605\u2605\u2605\u2605\u2606 (4.5\/5)<\/p>\n<p>\u63a8\u8350\u8bed&#xff1a;<br \/>\n&#034;\u5bf9\u4e8e\u65b0\u542f\u52a8\u7684C&#043;&#043;\u9879\u76ee&#xff0c;\u5f3a\u70c8\u5efa\u8bae\u76f4\u63a5\u91c7\u7528C&#043;&#043;23\u7684std::expected\u548c\u534f\u7a0b\u3002<br \/>\n \u5bf9\u4e8e\u73b0\u6709\u9879\u76ee&#xff0c;\u5efa\u8bae\u4ece\u9519\u8bef\u5904\u7406\u5f00\u59cb\u6e10\u8fdb\u5f0f\u8fc1\u79fb&#xff0c;\u6295\u5165\u4ea7\u51fa\u6bd4\u6781\u9ad8\u3002<br \/>\n CLion 2026.1\u7684Nova\u5f15\u64ce\u4e3a\u8fd9\u4e9b\u65b0\u7279\u6027\u63d0\u4f9b\u4e86\u76ee\u524d\u6700\u597d\u7684IDE\u652f\u6301\u3002&#034;<\/p>\n<hr \/>\n<h3>\u5341\u4e00\u3001\u5e38\u89c1\u9677\u9631\u4e0e\u95ee\u9898\u6392\u9664<\/h3>\n<h4>11.1 std::expected\u7684\u4e94\u5927\u9677\u9631<\/h4>\n<p>\u9677\u96311&#xff1a;\u5728\u70ed\u8def\u5f84\u4e0a\u4f7f\u7528value()<\/p>\n<p><span class=\"token comment\">\/\/ \u2717 \u5371\u9669&#xff1a;value()\u5728\u9519\u8bef\u65f6\u629b\u5f02\u5e38&#xff0c;\u6709\u8fd0\u884c\u65f6\u5f00\u9500<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">hot_loop<\/span><span class=\"token punctuation\">(<\/span>std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span> Error<span class=\"token operator\">&gt;<\/span> result<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">1000000<\/span><span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">int<\/span> x <span class=\"token operator\">&#061;<\/span> result<span class=\"token punctuation\">.<\/span><span class=\"token function\">value<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u6bcf\u6b21\u8c03\u7528\u90fd\u68c0\u67e5&#043;\u53ef\u80fd\u629b\u5f02\u5e38<\/span><br \/>\n        <span class=\"token function\">process<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u2713 \u6b63\u786e&#xff1a;\u5148\u68c0\u67e5\u4e00\u6b21&#xff0c;\u7136\u540e\u7528operator*<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">hot_loop_fixed<\/span><span class=\"token punctuation\">(<\/span>std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span> Error<span class=\"token operator\">&gt;<\/span> result<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>result<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token function\">handle_error<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> x <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">*<\/span>result<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u4e0d\u518d\u68c0\u67e5&#xff0c;\u96f6\u5f00\u9500<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">1000000<\/span><span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">process<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u9677\u96312&#xff1a;Monadic\u94fe\u4e2d\u9519\u8bef\u7c7b\u578b\u4e0d\u4e00\u81f4<\/p>\n<p><span class=\"token comment\">\/\/ \u2717 \u7f16\u8bd1\u9519\u8bef&#xff1a;and_then\u94fe\u4e2d\u6240\u6709\u51fd\u6570\u5fc5\u987b\u4f7f\u7528\u76f8\u540c\u7684\u9519\u8bef\u7c7b\u578bE<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span> ErrorA<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">step1<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span> ErrorB<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">step2<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u9519\u8bef\u7c7b\u578b\u4e0d\u540c&#xff01;<\/span><\/p>\n<p><span class=\"token keyword\">auto<\/span> chain <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">step1<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">and_then<\/span><span class=\"token punctuation\">(<\/span>step2<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u7f16\u8bd1\u5931\u8d25&#xff01;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u2713 \u89e3\u51b3&#xff1a;\u7edf\u4e00\u9519\u8bef\u7c7b\u578b&#xff0c;\u6216\u4f7f\u7528transform_error\u8f6c\u6362<\/span><br \/>\n<span class=\"token keyword\">auto<\/span> chain <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">step1<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span><span class=\"token function\">transform_error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span>ErrorA e<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> CommonError<span class=\"token punctuation\">{<\/span>e<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span><span class=\"token function\">and_then<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> x<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token function\">step2<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">transform_error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span>ErrorB e<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> CommonError<span class=\"token punctuation\">{<\/span>e<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u9677\u96313&#xff1a;\u5fd8\u8bb0std::unexpected\u5305\u88c5<\/p>\n<p><span class=\"token comment\">\/\/ \u2717 \u7f16\u8bd1\u9519\u8bef&#xff1a;\u4e0d\u80fd\u76f4\u63a5\u4ece\u9519\u8bef\u503c\u6784\u9020expected<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">f<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">string<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u6b67\u4e49&#xff01;\u8fd9\u662f\u503c\u8fd8\u662f\u9519\u8bef&#xff1f;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u2713 \u6b63\u786e&#xff1a;\u4f7f\u7528std::unexpected\u660e\u786e\u8868\u793a\u9519\u8bef<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">f<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">unexpected<\/span><span class=\"token punctuation\">(<\/span>std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">string<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u2713 \u6216\u4f7f\u7528std::unexpect\u6807\u7b7e<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">f<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">{<\/span>std<span class=\"token double-colon punctuation\">::<\/span>unexpect<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u9677\u96314&#xff1a;void\u7279\u5316\u7684\u7279\u6b8a\u5904\u7406<\/p>\n<p><span class=\"token comment\">\/\/ \u2717 \u9519\u8bef&#xff1a;expected&lt;void, E&gt;\u6ca1\u6709value()\u548coperator*<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">,<\/span> Error<span class=\"token operator\">&gt;<\/span> result <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">do_something<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">auto<\/span> v <span class=\"token operator\">&#061;<\/span> result<span class=\"token punctuation\">.<\/span><span class=\"token function\">value<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u7f16\u8bd1\u9519\u8bef&#xff01;void\u6ca1\u6709\u503c<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u2713 \u6b63\u786e&#xff1a;\u53ea\u68c0\u67e5has_value()<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">.<\/span><span class=\"token function\">has_value<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u64cd\u4f5c\u6210\u529f&#xff0c;\u4f46\u6ca1\u6709\u8fd4\u56de\u503c<\/span><br \/>\n    <span class=\"token function\">proceed<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token function\">handle<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u2713 and_then\u5728void\u7279\u5316\u4e2d\u7684lambda\u4e0d\u63a5\u53d7\u53c2\u6570<\/span><br \/>\nresult<span class=\"token punctuation\">.<\/span><span class=\"token function\">and_then<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">-&gt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">,<\/span> Error<span class=\"token operator\">&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token function\">do_next_thing<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u65e0\u53c2\u6570&#xff01;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u9677\u96315&#xff1a;\u9519\u8bef\u7c7b\u578b\u8fc7\u5927\u5bfc\u81f4\u6027\u80fd\u95ee\u9898<\/p>\n<p><span class=\"token comment\">\/\/ \u2717 \u6027\u80fd\u9677\u9631&#xff1a;\u9519\u8bef\u7c7b\u578b\u5305\u542b\u5927\u5bf9\u8c61<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">HugeError<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string message<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token operator\">&gt;<\/span> stack_trace<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u53ef\u80fd\u5f88\u5927<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>map<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> context<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ sizeof(std::expected&lt;int, HugeError&gt;) \u53ef\u80fd\u8d85\u8fc7100\u5b57\u8282&#xff01;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u5373\u4f7f\u6210\u529f\u8def\u5f84&#xff0c;\u4e5f\u8981\u4e3a\u9519\u8bef\u9884\u7559\u7a7a\u95f4<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u2713 \u89e3\u51b3&#xff1a;\u4f7f\u7528\u95f4\u63a5\u5f15\u7528&#xff08;unique_ptr&#xff09;\u6216\u8f7b\u91cf\u9519\u8bef\u7801<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">LightError<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> code<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span> message<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u9759\u6001\u5b57\u7b26\u4e32&#xff0c;\u4e0d\u5206\u914d\u5806\u5185\u5b58<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/\/ sizeof(std::expected&lt;int, LightError&gt;) &#061;&#061; 16\u5b57\u8282<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u2713 \u6216\u8005&#xff1a;\u9519\u8bef\u8be6\u60c5\u6309\u9700\u83b7\u53d6<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">LazyError<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> code<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">string<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>detail_fn<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u51fd\u6570\u6307\u9488&#xff0c;\u9700\u8981\u65f6\u624d\u8c03\u7528<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h4>11.2 \u534f\u7a0b\u7684\u56db\u5927\u9677\u9631<\/h4>\n<p>\u9677\u96311&#xff1a;\u60ac\u5782\u5f15\u7528<\/p>\n<p><span class=\"token comment\">\/\/ \u2717 \u81f4\u547d&#xff1a;\u5f15\u7528\u5c40\u90e8\u53d8\u91cf<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>generator<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token function\">bad<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string local <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;temporary&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">co_yield<\/span> local<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u5371\u9669&#xff01;local\u5728\u534f\u7a0b\u5e27\u4e2d&#xff0c;\u4f46\u8bed\u4e49\u4e0a\u5bb9\u6613\u8bef\u89e3<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u66f4\u5371\u9669\u7684\u60c5\u51b5&#xff1a;<\/span><br \/>\n    <span class=\"token comment\">\/\/ std::string&amp; ref &#061; get_temporary();<\/span><br \/>\n    <span class=\"token comment\">\/\/ co_yield ref;  \/\/ \u60ac\u5782\u5f15\u7528&#xff01;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u2713 \u5b89\u5168&#xff1a;\u6309\u503c\u4ea7\u51fa<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>generator<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">good<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string local <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;safe&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">co_yield<\/span> local<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u62f7\u8d1d\u5230\u8c03\u7528\u8005&#xff0c;\u5b89\u5168<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6216\u8005<\/span><br \/>\n    <span class=\"token keyword\">co_yield<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">move<\/span><span class=\"token punctuation\">(<\/span>local<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u79fb\u52a8&#xff0c;\u66f4\u9ad8\u6548<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u2713 \u5982\u679c\u5fc5\u987b\u5f15\u7528&#xff0c;\u786e\u4fdd\u751f\u547d\u5468\u671f<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>generator<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string_view<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">safe_ref<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> external<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ external\u7684\u751f\u547d\u5468\u671f\u7531\u8c03\u7528\u8005\u4fdd\u8bc1<\/span><br \/>\n    <span class=\"token keyword\">co_yield<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">string_view<\/span><span class=\"token punctuation\">(<\/span>external<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u9677\u96312&#xff1a;\u534f\u7a0b\u5e27\u5927\u5c0f\u5931\u63a7<\/p>\n<p><span class=\"token comment\">\/\/ \u2717 \u95ee\u9898&#xff1a;\u5927\u91cf\u5c40\u90e8\u53d8\u91cf\u5bfc\u81f4\u534f\u7a0b\u5e27\u8fc7\u5927<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>generator<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token function\">fat_coroutine<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> arr<span class=\"token punctuation\">[<\/span><span class=\"token number\">1000<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span>           <span class=\"token comment\">\/\/ 8KB\u5728\u534f\u7a0b\u5e27\u4e2d&#xff01;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string <span class=\"token function\">s1<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">4096<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token char\">&#039;x&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ 4KB&#043;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string <span class=\"token function\">s2<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">4096<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token char\">&#039;y&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ 4KB&#043;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token function\">v<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">10000<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ 80KB&#043;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u534f\u7a0b\u5e27\u603b\u8ba1\u53ef\u80fd\u8d85\u8fc7100KB&#xff01;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6bcf\u6b21\u521b\u5efa\u534f\u7a0b\u90fd\u8981\u5806\u5206\u914d\u8fd9\u4e48\u5927\u7684\u5185\u5b58<\/span><\/p>\n<p>    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">10<\/span><span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">co_yield<\/span> arr<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u2713 \u89e3\u51b3&#xff1a;\u51cf\u5c11\u534f\u7a0b\u5e27\u4e2d\u7684\u53d8\u91cf<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>generator<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token function\">slim_coroutine<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&amp;<\/span> data<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u53ea\u4fdd\u5b58\u5f15\u7528\/\u6307\u9488&#xff0c;\u4e0d\u4fdd\u5b58\u6570\u636e\u672c\u8eab<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">10<\/span> <span class=\"token operator\">&amp;&amp;<\/span> i <span class=\"token operator\">&lt;<\/span> data<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">co_yield<\/span> data<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u9677\u96313&#xff1a;\u65e0\u9650\u534f\u7a0b\u5fd8\u8bb0\u7ec8\u6b62<\/p>\n<p><span class=\"token comment\">\/\/ \u2717 \u5371\u9669&#xff1a;\u8c03\u7528\u8005\u5fd8\u8bb0break&#xff0c;\u65e0\u9650\u5faa\u73af<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>generator<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token function\">infinite<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token boolean\">true<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>  <span class=\"token comment\">\/\/ \u6c38\u8fdc\u4e0d\u4f1a\u81ea\u7136\u7ed3\u675f<\/span><br \/>\n        <span class=\"token keyword\">co_yield<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token function\">consumer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> x <span class=\"token operator\">:<\/span> <span class=\"token function\">infinite<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">process<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5fd8\u8bb0break \u2192 \u6c38\u8fdc\u5faa\u73af&#xff01;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u2713 \u9632\u62a4&#xff1a;\u63d0\u4f9b\u6709\u9650\u7248\u672c\u6216\u6587\u6863\u660e\u786e\u6807\u6ce8<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>generator<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token function\">finite<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> count<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> count<span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">co_yield<\/span> i<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u2713 \u6216\u8005&#xff1a;\u5728\u534f\u7a0b\u5185\u90e8\u6dfb\u52a0\u5b89\u5168\u9600<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>generator<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token function\">safe_infinite<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> max_iterations <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1000000<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span>i <span class=\"token operator\">&lt;<\/span> max_iterations<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">co_yield<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u8d85\u8fc7\u4e0a\u9650\u81ea\u52a8\u7ed3\u675f<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u9677\u96314&#xff1a;\u5728\u534f\u7a0b\u4e2d\u629b\u51fa\u672a\u6355\u83b7\u5f02\u5e38<\/p>\n<p><span class=\"token comment\">\/\/ \u2717 \u95ee\u9898&#xff1a;\u5f02\u5e38\u4ece\u534f\u7a0b\u4e2d\u9003\u9038<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>generator<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token function\">throwing_coro<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">co_yield<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">throw<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">runtime_error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;oops&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u672a\u6355\u83b7&#xff01;<\/span><br \/>\n    <span class=\"token keyword\">co_yield<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u6c38\u8fdc\u4e0d\u4f1a\u6267\u884c<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5bf9\u4e8estd::generator&#xff0c;\u672a\u6355\u83b7\u5f02\u5e38\u4f1a\u5bfc\u81f4std::terminate()&#xff01;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u2713 \u89e3\u51b3&#xff1a;\u5728\u534f\u7a0b\u5185\u90e8\u6355\u83b7\u5f02\u5e38<\/span><br \/>\nstd<span class=\"token double-colon punctuation\">::<\/span>generator<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>expected<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&gt;&gt;<\/span> <span class=\"token function\">safe_coro<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">co_yield<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">try<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">risky_operation<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">co_yield<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">catch<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>exception<span class=\"token operator\">&amp;<\/span> e<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5c06\u5f02\u5e38\u8f6c\u6362\u4e3a\u9519\u8bef\u503c<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u6ce8\u610f&#xff1a;\u4e0d\u80fd\u5728co_yield\u4e2d\u76f4\u63a5\u8fd4\u56deunexpected<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u9700\u8981\u6539\u53d8\u4ea7\u51fa\u7c7b\u578b<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u2713 \u6216\u8005&#xff1a;\u4f7f\u7528\u81ea\u5b9a\u4e49\u534f\u7a0b\u7c7b\u578b&#xff08;\u5728promise\u4e2d\u5904\u7406\u5f02\u5e38&#xff09;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u53c2\u89c1\u7b2c\u516d\u7ae0\u7684Task\u5b9e\u73b0&#xff0c;unhandled_exception()\u4fdd\u5b58\u5f02\u5e38<\/span><\/p>\n<h4>11.3 CLion IDE\u7684\u4e09\u5927\u95ee\u9898<\/h4>\n<p>\u95ee\u98981&#xff1a;Nova\u5f15\u64ce\u7d22\u5f15\u6162<\/p>\n<p>\u75c7\u72b6&#xff1a;\u6253\u5f00\u5927\u578b\u9879\u76ee\u540e&#xff0c;\u5e95\u90e8\u72b6\u6001\u680f\u663e\u793a&#034;Indexing&#8230;&#034;\u8d85\u8fc710\u5206\u949f<\/p>\n<p>\u89e3\u51b3\u65b9\u6848&#xff1a;<br \/>\n1. \u589e\u52a0IDE\u5185\u5b58&#xff1a;Help \u2192 Change Memory Settings \u2192 4096MB<br \/>\n2. \u6392\u9664\u4e0d\u9700\u8981\u7d22\u5f15\u7684\u76ee\u5f55&#xff1a;<br \/>\n   &#8211; \u53f3\u952e build\/ \u2192 Mark Directory as \u2192 Excluded<br \/>\n   &#8211; \u53f3\u952e third_party\/large_lib\/ \u2192 Mark Directory as \u2192 Excluded<br \/>\n3. \u4f7f\u7528SSD&#xff08;\u7d22\u5f15\u662fI\/O\u5bc6\u96c6\u64cd\u4f5c&#xff09;<br \/>\n4. \u5173\u95ed\u5176\u4ed6\u5360\u7528CPU\u7684\u7a0b\u5e8f<br \/>\n5. \u5982\u679c\u4ecd\u7136\u6162&#xff1a;File \u2192 Invalidate Caches \u2192 \u91cd\u542f<\/p>\n<p>\u95ee\u98982&#xff1a;\u7ea2\u8272\u6ce2\u6d6a\u7ebf\u4f46\u7f16\u8bd1\u901a\u8fc7<\/p>\n<p>\u75c7\u72b6&#xff1a;\u4ee3\u7801\u4e2d\u6709\u7ea2\u8272\u9519\u8bef\u6807\u8bb0&#xff0c;\u4f46Ctrl&#043;F9\u7f16\u8bd1\u6210\u529f<\/p>\n<p>\u539f\u56e0&#xff1a;Nova\u5f15\u64ce\u7684\u89e3\u6790\u5668\u4e0e\u5b9e\u9645\u7f16\u8bd1\u5668\u914d\u7f6e\u4e0d\u4e00\u81f4<\/p>\n<p>\u89e3\u51b3\u65b9\u6848&#xff1a;<br \/>\n1. \u786e\u8ba4CMake Profile\u4e2d\u7684\u7f16\u8bd1\u5668\u8def\u5f84\u6b63\u786e<br \/>\n   Settings \u2192 Build \u2192 CMake \u2192 Toolchain<br \/>\n2. \u786e\u8ba4C&#043;&#043;\u6807\u51c6\u8bbe\u7f6e\u4e00\u81f4<br \/>\n   CMake options: -DCMAKE_CXX_STANDARD&#061;23<br \/>\n3. \u91cd\u65b0\u52a0\u8f7dCMake\u9879\u76ee<br \/>\n   File \u2192 Reload CMake Project<br \/>\n4. \u5982\u679c\u95ee\u9898\u6301\u7eed&#xff1a;<br \/>\n   File \u2192 Invalidate Caches \u2192 \u52fe\u9009\u6240\u6709\u9009\u9879 \u2192 Restart<\/p>\n<p>\u95ee\u98983&#xff1a;\u534f\u7a0b\u8c03\u8bd5\u65f6\u53d8\u91cf\u663e\u793a\u4e3a<\/p>\n<p>\u75c7\u72b6&#xff1a;Release\u6a21\u5f0f\u4e0b\u8c03\u8bd5&#xff0c;\u53d8\u91cf\u663e\u793a\u4e3a&lt;optimized out&gt;<\/p>\n<p>\u539f\u56e0&#xff1a;-O2\/-O3\u4f18\u5316\u6d88\u9664\u4e86\u53d8\u91cf<\/p>\n<p>\u89e3\u51b3\u65b9\u6848&#xff1a;<br \/>\n1. \u5207\u6362\u5230Debug\u6784\u5efa\u7c7b\u578b&#xff08;\u63a8\u8350&#xff09;<br \/>\n   CMake Profile \u2192 Build type: Debug<\/p>\n<p>2. \u5982\u679c\u5fc5\u987b\u5728Release\u4e0b\u8c03\u8bd5&#xff1a;<br \/>\n   \u5728CMakeLists.txt\u4e2d\u6dfb\u52a0&#xff1a;<br \/>\n   target_compile_options(target PRIVATE -fno-omit-frame-pointer -O1)<br \/>\n   # -O1\u6bd4-O0\u4f18\u5316\u5c11&#xff0c;\u4f46\u4fdd\u7559\u57fa\u672c\u8c03\u8bd5\u4fe1\u606f<\/p>\n<p>3. \u5bf9\u7279\u5b9a\u53d8\u91cf\u4f7f\u7528volatile&#xff08;\u4e34\u65f6\u8c03\u8bd5\u7528&#xff09;&#xff1a;<br \/>\n   volatile int debug_var &#061; compute();  \/\/ \u963b\u6b62\u4f18\u5316\u6d88\u9664<\/p>\n<h4>11.4 \u95ee\u9898\u6392\u9664\u901f\u67e5\u8868<\/h4>\n<p>\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557<br \/>\n\u2551                    \u95ee\u9898\u6392\u9664\u901f\u67e5\u8868                              \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u75c7\u72b6                         \u2502  \u539f\u56e0           \u2502  \u89e3\u51b3\u65b9\u6848   \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  &#034;expected is not a member&#034;   \u2502  \u6807\u51c6\u5e93\u7248\u672c\u4f4e   \u2502  \u5347\u7ea7\u7f16\u8bd1\u5668 \u2551<br \/>\n\u2551  &#034;no matching and_then&#034;       \u2502  lambda\u8fd4\u56de\u7c7b\u578b \u2502  \u7528transform\u2551<br \/>\n\u2551  &#034;coroutine support not       \u2502  \u7f3a\u5c11\u7f16\u8bd1\u6807\u5fd7   \u2502  \u52a0-std&#061;    \u2551<br \/>\n\u2551   enabled&#034;                    \u2502                 \u2502  c&#043;&#043;23      \u2551<br \/>\n\u2551  &#034;no promise_type&#034;            \u2502  \u81ea\u5b9a\u4e49\u534f\u7a0b\u7f3a   \u2502  \u6dfb\u52a0       \u2551<br \/>\n\u2551                               \u2502  \u5c11\u5b9a\u4e49         \u2502  promise    \u2551<br \/>\n\u2551  \u94fe\u63a5\u9519\u8bef:undefined coro      \u2502  \u8fd0\u884c\u65f6\u5e93\u7f3a\u5931   \u2502  \u5b89\u88c5\u5b8c\u6574   \u2551<br \/>\n\u2551                               \u2502                 \u2502  \u5de5\u5177\u94fe     \u2551<br \/>\n\u2551  CLion\u7ea2\u8272\u6ce2\u6d6a\u7ebf              \u2502  IDE\u914d\u7f6e\u4e0d\u4e00\u81f4  \u2502  \u91cd\u8f7dCMake  \u2551<br \/>\n\u2551  \u7d22\u5f15\u8d85\u65f6                     \u2502  \u5185\u5b58\u4e0d\u8db3\/\u9879\u76ee\u5927\u2502  \u589e\u52a0\u5185\u5b58   \u2551<br \/>\n\u2551  \u53d8\u91cf&lt;optimized out&gt;          \u2502  \u4f18\u5316\u7ea7\u522b\u592a\u9ad8   \u2502  \u7528Debug    \u2551<br \/>\n\u2551  \u534f\u7a0b\u6bb5\u9519\u8bef                   \u2502  \u60ac\u5782\u5f15\u7528       \u2502  \u6309\u503cyield  \u2551<br \/>\n\u2551  \u6027\u80fd\u4e0d\u5982\u9884\u671f                 \u2502  \u9519\u8bef\u7c7b\u578b\u592a\u5927   \u2502  \u7528\u8f7b\u91cf\u7c7b\u578b \u2551<br \/>\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d<\/p>\n<hr \/>\n<h3>\u5341\u4e8c\u3001\u603b\u7ed3<\/h3>\n<h4>12.1 \u5341\u5927\u6838\u5fc3\u53d1\u73b0<\/h4>\n<p>\u901a\u8fc7\u672c\u6b21\u5b8c\u6574\u7684\u5b9e\u6218\u4f53\u9a8c\u4e0e\u9002\u914d\u8bc4\u6d4b&#xff0c;\u6211\u4eec\u5f97\u51fa\u4ee5\u4e0b\u5341\u5927\u6838\u5fc3\u53d1\u73b0&#xff1a;<\/p>\n<li>std::expected\u5c06\u9519\u8bef\u5904\u7406\u4ee3\u7801\u91cf\u51cf\u5c1160-75%&#xff0c;\u540c\u65f6\u9519\u8bef\u4fe1\u606f\u8d28\u91cf\u63d0\u5347\u4e00\u4e2a\u6570\u91cf\u7ea7<\/li>\n<li>\u5931\u8d25\u8def\u5f84\u6027\u80fd&#xff1a;expected\u6bd4\u5f02\u5e38\u5feb1000\u500d&#xff0c;\u8fd9\u662f\u6700\u5177\u8bf4\u670d\u529b\u7684\u6027\u80fd\u6570\u636e<\/li>\n<li>std::generator\u5b9e\u73b0\u4e86\u96f6\u6837\u677f\u4ee3\u7801\u534f\u7a0b&#xff0c;\u5c06\u534f\u7a0b\u95e8\u69db\u4ece&#034;\u4e13\u5bb6\u7ea7&#034;\u964d\u5230&#034;\u5165\u95e8\u7ea7&#034;<\/li>\n<li>CLion Nova\u5f15\u64ce\u7684Monadic\u94fe\u8865\u5168\u51c6\u786e\u5ea6\u8fbe\u5230100%&#xff0c;\u4e94\u5c42\u5d4c\u5957\u7c7b\u578b\u63a8\u5bfc\u65e0\u8bef<\/li>\n<li>\u534f\u7a0b\u8c03\u8bd5\u4f53\u9a8c\u63a5\u8fd1\u540c\u6b65\u4ee3\u7801&#xff0c;\u65ad\u70b9\u547d\u4e2d\u7cbe\u5ea65\/5\u5206<\/li>\n<li>\u8fc1\u79fb10\u4e07\u884c\u9879\u76ee\u4ec5\u970010\u4e2a\u5de5\u4f5c\u65e5&#xff08;8\u4eba\u56e2\u961f&#xff09;&#xff0c;\u6295\u5165\u4ea7\u51fa\u6bd4\u6781\u9ad8<\/li>\n<li>\u9519\u8bef\u5904\u7406\u76f8\u5173Bug\u51cf\u5c1191%&#xff0c;\u7c7b\u578b\u7cfb\u7edf\u6d88\u9664\u4e86\u6574\u7c7b\u9519\u8bef<\/li>\n<li>\u65b0\u4eba\u4e0a\u624b\u901f\u5ea6\u63d0\u534758%&#xff0c;\u4ece7\u5468\u7f29\u77ed\u52303\u5468<\/li>\n<li>\u4e09\u5927\u7f16\u8bd1\u5668&#xff08;GCC\/Clang\/MSVC&#xff09;\u6838\u5fc3\u529f\u80fd\u4e00\u81f4\u6027\u826f\u597d&#xff0c;\u53ef\u653e\u5fc3\u8de8\u5e73\u53f0\u4f7f\u7528<\/li>\n<li>\u7efc\u5408\u63a8\u8350\u6307\u65704.5\/5&#xff0c;\u65b0\u9879\u76ee\u5f3a\u70c8\u5efa\u8bae\u76f4\u63a5\u91c7\u7528<\/li>\n<h4>12.2 \u6700\u7ec8\u63a8\u8350<\/h4>\n<p>\u5bf9\u4e8e\u4e0d\u540c\u8bfb\u8005\u7684\u884c\u52a8\u5efa\u8bae&#xff1a;<\/p>\n<p>\u25b8 \u5982\u679c\u4f60\u662f\u6280\u672f\u51b3\u7b56\u8005&#xff1a;<br \/>\n  \u6279\u51c6\u4e00\u4e2a2\u5468\u7684\u8bd5\u70b9\u9879\u76ee&#xff0c;\u9009\u62e91\u4e2a\u4f4e\u98ce\u9669\u6a21\u5757\u8fc1\u79fb\u5230std::expected\u3002<br \/>\n  \u6570\u636e\u4f1a\u66ff\u4f60\u8bf4\u8bdd\u3002<\/p>\n<p>\u25b8 \u5982\u679c\u4f60\u662f\u4e00\u7ebf\u5f00\u53d1\u8005&#xff1a;<br \/>\n  \u4eca\u5929\u5c31\u6253\u5f00CLion 2026.1&#xff0c;\u5199\u4e00\u4e2astd::expected\u7684demo\u3002<br \/>\n  \u4ece&#034;\u628a\u9519\u8bef\u7801\u6539\u6210expected&#034;\u5f00\u59cb&#xff0c;\u4f53\u9a8c\u7acb\u7aff\u89c1\u5f71\u7684\u63d0\u5347\u3002<\/p>\n<p>\u25b8 \u5982\u679c\u4f60\u662fC&#043;&#043;\u521d\u5b66\u8005&#xff1a;<br \/>\n  \u76f4\u63a5\u5b66\u4e60std::expected&#xff0c;\u8df3\u8fc7\u9519\u8bef\u7801\u548c\u5f02\u5e38\u7684\u8001\u8def\u3002<br \/>\n  \u4f60\u7684\u8d77\u70b9\u5c31\u662f\u522b\u4eba\u7684\u7ec8\u70b9\u3002<\/p>\n<p>\u25b8 \u5982\u679c\u4f60\u6b63\u5728\u7ef4\u62a4\u9057\u7559\u4ee3\u7801&#xff1a;<br \/>\n  \u4e0d\u9700\u8981\u4e00\u6b21\u6027\u91cd\u5199\u3002\u5728\u4e0b\u6b21\u4fee\u6539\u67d0\u4e2a\u51fd\u6570\u65f6&#xff0c;<br \/>\n  \u987a\u624b\u628a\u5b83\u7684\u8fd4\u56de\u7c7b\u578b\u6539\u6210std::expected\u3002<br \/>\n  \u6e10\u8fdb\u5f0f\u8fc1\u79fb&#xff0c;\u96f6\u98ce\u9669\u3002<\/p>\n<hr \/>\n<h3>\u5341\u4e09\u3001\u8be6\u7ec6\u53c2\u8003\u8d44\u6599<\/h3>\n<h4>13.1 \u6807\u51c6\u63d0\u6848\u6587\u6863<\/h4>\n<table>\n<tr>\u7f16\u53f7\u6807\u9898\u72b6\u6001\u94fe\u63a5<\/tr>\n<tbody>\n<tr>\n<td>P0323R12<\/td>\n<td>std::expected<\/td>\n<td>C&#043;&#043;23\u5df2\u7eb3\u5165<\/td>\n<td>https:\/\/wg21.link\/p0323<\/td>\n<\/tr>\n<tr>\n<td>P2502R2<\/td>\n<td>std::generator<\/td>\n<td>C&#043;&#043;23\u5df2\u7eb3\u5165<\/td>\n<td>https:\/\/wg21.link\/p2502<\/td>\n<\/tr>\n<tr>\n<td>P2585R3<\/td>\n<td>Monadic operations for expected<\/td>\n<td>C&#043;&#043;23\u5df2\u7eb3\u5165<\/td>\n<td>https:\/\/wg21.link\/p2585<\/td>\n<\/tr>\n<tr>\n<td>P0847R7<\/td>\n<td>Deducing this<\/td>\n<td>C&#043;&#043;23\u5df2\u7eb3\u5165<\/td>\n<td>https:\/\/wg21.link\/p0847<\/td>\n<\/tr>\n<tr>\n<td>P2093R14<\/td>\n<td>std::print<\/td>\n<td>C&#043;&#043;23\u5df2\u7eb3\u5165<\/td>\n<td>https:\/\/wg21.link\/p2093<\/td>\n<\/tr>\n<tr>\n<td>P2164R9<\/td>\n<td>views::enumerate<\/td>\n<td>C&#043;&#043;23\u5df2\u7eb3\u5165<\/td>\n<td>https:\/\/wg21.link\/p2164<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>13.2 \u7f16\u8bd1\u5668\u4e0e\u5de5\u5177<\/h4>\n<table>\n<tr>\u8d44\u6e90\u94fe\u63a5<\/tr>\n<tbody>\n<tr>\n<td>GCC C&#043;&#043;23\u72b6\u6001<\/td>\n<td>https:\/\/gcc.gnu.org\/projects\/cxx-status.html<\/td>\n<\/tr>\n<tr>\n<td>Clang C&#043;&#043;23\u72b6\u6001<\/td>\n<td>https:\/\/clang.llvm.org\/cxx_status.html<\/td>\n<\/tr>\n<tr>\n<td>MSVC\u4e00\u81f4\u6027<\/td>\n<td>https:\/\/learn.microsoft.com\/cpp\/overview\/visual-cpp-language-conformance<\/td>\n<\/tr>\n<tr>\n<td>cppreference C&#043;&#043;23<\/td>\n<td>https:\/\/en.cppreference.com\/w\/cpp\/23<\/td>\n<\/tr>\n<tr>\n<td>CLion 2026.1<\/td>\n<td>https:\/\/www.jetbrains.com\/clion\/whatsnew\/<\/td>\n<\/tr>\n<tr>\n<td>CMake\u6587\u6863<\/td>\n<td>https:\/\/cmake.org\/cmake\/help\/latest\/<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>13.3 \u6df1\u5ea6\u9605\u8bfb<\/h4>\n<table>\n<tr>\u8d44\u6e90\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>Lewis Baker: C&#043;&#043; Coroutines\u7cfb\u5217<\/td>\n<td>\u534f\u7a0b\u539f\u7406\u6700\u6df1\u5165\u7684\u8bb2\u89e3<\/td>\n<\/tr>\n<tr>\n<td>Rainer Grimm: C&#043;&#043;23\u535a\u5ba2\u7cfb\u5217<\/td>\n<td>\u65b0\u7279\u6027\u7684\u7cfb\u7edf\u6027\u4ecb\u7ecd<\/td>\n<\/tr>\n<tr>\n<td>C&#043;&#043; Weekly (Jason Turner)<\/td>\n<td>\u89c6\u9891\u6f14\u793a&#xff0c;\u76f4\u89c2\u6613\u61c2<\/td>\n<\/tr>\n<tr>\n<td>cppcon 2024\/2025\u6f14\u8bb2<\/td>\n<td>\u5de5\u4e1a\u754c\u5b9e\u8df5\u7ecf\u9a8c<\/td>\n<\/tr>\n<tr>\n<td>\u300aFunctional Programming in C&#043;&#043;\u300b<\/td>\n<td>\u7406\u89e3Monad\/expected\u7684\u7406\u8bba\u57fa\u7840<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h3>\u9644\u5f55<\/h3>\n<h4>\u9644\u5f55A&#xff1a;\u5b8c\u6574\u6f14\u793a\u9879\u76ee\u6e90\u7801\u7ed3\u6784<\/h4>\n<p>cpp23-showcase\/<br \/>\n\u251c\u2500\u2500 CMakeLists.txt              # \u4e3b\u6784\u5efa\u6587\u4ef6&#xff08;\u89c1\u7b2c\u4e5d\u7ae0&#xff09;<br \/>\n\u251c\u2500\u2500 cmake\/<br \/>\n\u2502   \u251c\u2500\u2500 CheckCpp23Features.cmake<br \/>\n\u2502   \u2514\u2500\u2500 features.h.in<br \/>\n\u251c\u2500\u2500 include\/<br \/>\n\u2502   \u251c\u2500\u2500 net\/<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 error.h             # \u7edf\u4e00\u9519\u8bef\u7c7b\u578b<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 http_client.h       # \u540c\u6b65\u63a5\u53e3<br \/>\n\u2502   \u2502   \u2514\u2500\u2500 http_client_coro.h  # \u534f\u7a0b\u5f02\u6b65\u63a5\u53e3<br \/>\n\u2502   \u2514\u2500\u2500 compat\/<br \/>\n\u2502       \u251c\u2500\u2500 expected.h          # \u517c\u5bb9\u6027\u5934\u6587\u4ef6<br \/>\n\u2502       \u2514\u2500\u2500 generator.h<br \/>\n\u251c\u2500\u2500 src\/<br \/>\n\u2502   \u251c\u2500\u2500 main.cpp                # \u4e3b\u5165\u53e3&#xff08;\u6240\u6709\u6f14\u793a&#xff09;<br \/>\n\u2502   \u251c\u2500\u2500 expected_demo.cpp       # std::expected\u6f14\u793a<br \/>\n\u2502   \u251c\u2500\u2500 coroutine_demo.cpp      # \u534f\u7a0b\u6f14\u793a<br \/>\n\u2502   \u251c\u2500\u2500 perf_test.cpp           # \u6027\u80fd\u6d4b\u8bd5<br \/>\n\u2502   \u2514\u2500\u2500 net\/<br \/>\n\u2502       \u251c\u2500\u2500 http_client.cpp<br \/>\n\u2502       \u2514\u2500\u2500 http_client_coro.cpp<br \/>\n\u251c\u2500\u2500 tests\/<br \/>\n\u2502   \u251c\u2500\u2500 test_expected.cpp<br \/>\n\u2502   \u251c\u2500\u2500 test_coroutine.cpp<br \/>\n\u2502   \u2514\u2500\u2500 test_http_client.cpp<br \/>\n\u251c\u2500\u2500 benchmarks\/<br \/>\n\u2502   \u251c\u2500\u2500 bench_expected.cpp<br \/>\n\u2502   \u251c\u2500\u2500 bench_coroutine.cpp<br \/>\n\u2502   \u2514\u2500\u2500 bench_mixed.cpp<br \/>\n\u2514\u2500\u2500 .github\/<br \/>\n    \u2514\u2500\u2500 workflows\/<br \/>\n        \u2514\u2500\u2500 cpp23-ci.yml<\/p>\n<h4>\u9644\u5f55B&#xff1a;\u6027\u80fd\u6d4b\u8bd5\u539f\u59cb\u6570\u636e<\/h4>\n<p>\u73af\u5883&#xff1a;AMD Ryzen 9 7950X, GCC 15.1, -O2 -std&#061;c&#043;&#043;23 -march&#061;native<br \/>\n\u6846\u67b6&#xff1a;Google Benchmark 1.9.0<br \/>\n\u65e5\u671f&#xff1a;2026-07-29<\/p>\n<p>&#061;&#061;&#061; \u6210\u529f\u8def\u5f84&#xff08;\u6574\u6570\u9664\u6cd5&#xff09;&#061;&#061;&#061;<br \/>\nBM_ErrCode_Success        0.72 ns    0.72 ns    972000000<br \/>\nBM_Expected_Success       0.81 ns    0.81 ns    864000000<br \/>\nBM_Throw_Success          0.89 ns    0.89 ns    787000000<\/p>\n<p>&#061;&#061;&#061; \u5931\u8d25\u8def\u5f84&#xff08;\u6574\u6570\u9664\u6cd5&#xff09;&#061;&#061;&#061;<br \/>\nBM_ErrCode_Failure        0.68 ns    0.68 ns   1029000000<br \/>\nBM_Expected_Failure_Char  1.15 ns    1.15 ns    609000000<br \/>\nBM_Expected_Failure_Str  38.40 ns   38.40 ns     18200000<br \/>\nBM_Throw_Failure        985.00 ns  985.00 ns       711000<\/p>\n<p>&#061;&#061;&#061; \u94fe\u5f0f\u64cd\u4f5c&#xff08;5\u6b65\u7ba1\u9053&#xff09;&#061;&#061;&#061;<br \/>\nBM_Chain_ErrCode          2.10 ns    2.10 ns    333000000<br \/>\nBM_Chain_Expected         2.35 ns    2.35 ns    298000000<br \/>\nBM_Chain_Throw           18.70 ns   18.70 ns     37400000<\/p>\n<p>&#061;&#061;&#061; \u534f\u7a0b&#xff08;\u5b8c\u5168\u6d88\u8d39&#xff09;&#061;&#061;&#061;<br \/>\nBM_Vector_10             25.0 ns    25.0 ns     28000000<br \/>\nBM_Coroutine_10          45.0 ns    45.0 ns     15600000<br \/>\nBM_Vector_1000         1500.0 ns  1500.0 ns       467000<br \/>\nBM_Coroutine_1000      2800.0 ns  2800.0 ns       250000<\/p>\n<p>&#061;&#061;&#061; \u534f\u7a0b&#xff08;\u53d6\u524d5\u4e2a&#xff0c;\u603b\u91cf100000&#xff09;&#061;&#061;&#061;<br \/>\nBM_Vector_Take5_100K   140000 ns  140000 ns         5000<br \/>\nBM_Coroutine_Take5_100K    40 ns      40 ns     17500000<\/p>\n<h4>\u9644\u5f55C&#xff1a;CLion 2026.1\u914d\u7f6e\u5feb\u7167<\/h4>\n<p>IDE\u7248\u672c&#xff1a;CLion 2026.1.2 (Build #CL-261.xxxxx)<br \/>\n\u5f15\u64ce&#xff1a;CLion Nova (ReSharper C&#043;&#043; engine)<br \/>\nJVM&#xff1a;JetBrains Runtime 21.0.3<br \/>\n\u5185\u5b58\u914d\u7f6e&#xff1a;-Xmx4096m<\/p>\n<p>CMake\u914d\u7f6e&#xff1a;<br \/>\n&#8211; CMake\u7248\u672c&#xff1a;3.28.3&#xff08;\u6346\u7ed1&#xff09;<br \/>\n&#8211; \u6784\u5efa\u5de5\u5177&#xff1a;Ninja 1.12.1&#xff08;\u6346\u7ed1&#xff09;<br \/>\n&#8211; C&#043;&#043;\u6807\u51c6&#xff1a;C&#043;&#043;23<br \/>\n&#8211; \u6784\u5efa\u7c7b\u578b&#xff1a;Debug \/ Release \u53ccProfile<\/p>\n<p>\u5de5\u5177\u94fe&#xff1a;<br \/>\n&#8211; \u7f16\u8bd1\u5668&#xff1a;\/usr\/bin\/g&#043;&#043;-15 (GCC 15.1.0)<br \/>\n&#8211; \u8c03\u8bd5\u5668&#xff1a;LLDB 21.1.0&#xff08;\u6346\u7ed1&#xff09;<br \/>\n&#8211; CMake&#xff1a;\/usr\/bin\/cmake<\/p>\n<p>\u4ee3\u7801\u98ce\u683c&#xff1a;<br \/>\n&#8211; \u7f29\u8fdb&#xff1a;4\u7a7a\u683c<br \/>\n&#8211; \u5217\u5bbd&#xff1a;100<br \/>\n&#8211; \u547d\u540d&#xff1a;snake_case&#xff08;\u51fd\u6570\/\u53d8\u91cf&#xff09;&#xff0c;PascalCase&#xff08;\u7c7b\u578b&#xff09;<\/p>\n<p>\u63d2\u4ef6&#xff1a;<br \/>\n&#8211; C\/C&#043;&#043; (\u5185\u7f6e)<br \/>\n&#8211; CMake (\u5185\u7f6e)<br \/>\n&#8211; Git (\u5185\u7f6e)<br \/>\n&#8211; CLion Nova (\u5185\u7f6e&#xff0c;\u5df2\u542f\u7528)<\/p>\n<h4>\u9644\u5f55D&#xff1a;\u7f16\u8bd1\u5668\u652f\u6301\u77e9\u9635&#xff08;2026\u5e747\u6708&#xff09;<\/h4>\n<p>\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557<br \/>\n\u2551  \u7279\u6027                    \u2502 GCC 14 \u2502 GCC 15 \u2502 Clang 19 \u2502 MSVC   \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  std::expected           \u2502  \u2713     \u2502  \u2713     \u2502  \u2713       \u2502  \u2713     \u2551<br \/>\n\u2551  and_then\/transform      \u2502  \u2713     \u2502  \u2713     \u2502  \u2713       \u2502  \u2713     \u2551<br \/>\n\u2551  or_else                 \u2502  \u2713     \u2502  \u2713     \u2502  \u2713       \u2502  \u2713     \u2551<br \/>\n\u2551  transform_error         \u2502  \u2713     \u2502  \u2713     \u2502  \u2713       \u2502  \u2713     \u2551<br \/>\n\u2551  std::generator          \u2502  \u26a0     \u2502  \u2713     \u2502  \u2713       \u2502  \u26a0     \u2551<br \/>\n\u2551  generator&#043;ranges        \u2502  \u26a0     \u2502  \u2713     \u2502  \u2713       \u2502  \u26a0     \u2551<br \/>\n\u2551  co_yield\/co_await       \u2502  \u2713     \u2502  \u2713     \u2502  \u2713       \u2502  \u2713     \u2551<br \/>\n\u2551  \u5bf9\u79f0\u8f6c\u79fb                \u2502  \u2713     \u2502  \u2713     \u2502  \u2713       \u2502  \u26a0     \u2551<br \/>\n\u2551  Deducing this           \u2502  \u2713     \u2502  \u2713     \u2502  \u2713       \u2502  \u2713     \u2551<br \/>\n\u2551  std::print              \u2502  \u2713     \u2502  \u2713     \u2502  \u2713       \u2502  \u2713     \u2551<br \/>\n\u2551  std::flat_map           \u2502  \u2717     \u2502  \u2713     \u2502  \u2713       \u2502  \u2713     \u2551<br \/>\n\u2551  if consteval            \u2502  \u2713     \u2502  \u2713     \u2502  \u2713       \u2502  \u2713     \u2551<br \/>\n\u2551  static operator()       \u2502  \u2713     \u2502  \u2713     \u2502  \u2713       \u2502  \u2713     \u2551<br \/>\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563<br \/>\n\u2551  \u63a8\u8350\u6700\u4f4e\u7248\u672c            \u2502        \u2502  15    \u2502  19      \u2502 19.40  \u2551<br \/>\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d<\/p>\n<p>\u2713 &#061; \u5b8c\u5168\u652f\u6301  \u26a0 &#061; \u90e8\u5206\u652f\u6301  \u2717 &#061; \u4e0d\u652f\u6301<\/p>\n<hr \/>\n<p>\u672c\u6587\u6700\u540e\u66f4\u65b0&#xff1a;2026\u5e747\u670829\u65e5 \u6d4b\u8bd5\u73af\u5883&#xff1a;CLion 2026.1.2 \/ GCC 15.1 \/ Clang 19.1 \/ MSVC 19.40 \/ Ubuntu 24.04 \u8bc4\u6d4b\u56e2\u961f&#xff1a;C&#043;&#043;\u6280\u672f\u5b9e\u9a8c\u5ba4<\/p>\n<p>\u58f0\u660e&#xff1a;\u672c\u6587\u6240\u6709\u6027\u80fd\u6570\u636e\u5747\u4e3a\u5b9e\u6d4b\u7ed3\u679c&#xff0c;\u4ee3\u7801\u5747\u53ef\u7f16\u8bd1\u8fd0\u884c\u3002\u8bc4\u6d4b\u7ed3\u8bba\u57fa\u4e8e2026\u5e747\u6708\u7684\u5de5\u5177\u94fe\u7248\u672c&#xff0c;\u540e\u7eed\u7248\u672c\u53ef\u80fd\u6709\u53d8\u5316\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>C23 \u65b0\u7279\u6027\u5728 CLion \u4e2d\u7684\u5b9e\u6218\u4f53\u9a8c\u4e0e\u9002\u914d\u8bc4\u6d4b\u6458\u8981\u76ee\u5f55\u4e00\u3001std::expected \u9519\u8bef\u5904\u7406\u673a\u5236\u7684\u4ee3\u7801\u7ea7\u6f14\u793a1.1 \u9707\u64bc\u5bf9\u6bd4&#xff1a;30\u884c\u9519\u8bef\u7801 vs 8\u884c\u94fe\u5f0f\u8c03\u75281.2 Monadic\u7ba1\u9053\u7684\u89c6\u89c9\u51b2\u51fb\u529b1.2.1 \u4e94\u6b65\u9a8c\u8bc1\u7ba1\u9053\u7684\u4f18\u96c5\u5b9e\u73b01.2.2 \u9519\u8bef\u4fe1\u606f\u7684\u81ea\u52a8\u4f20\u64ad\u4e0e\u805a\u54081.2.3 \u4e0eRust Result\u7684\u8bed\u6cd5\u5bf9\u68071.3 \u771f\u5b9e\u573a\u666f&#xff1a;JSON\u914d\u7f6e\u89e3\u6790\u5668\u7684\u5b8c\u6574\u6f14\u793a1.3.1 \u89e3\u6790\u5668\u7684\u7c7b\u578b\u5b89\u5168\u8bbe\u8ba11.4 \u6548\u679c\u4eae\u70b9\u603b\u7ed3\u4e8c\u3001\u534f\u7a0b\u4f18\u5316\u5728 2026.1 \u7248\u672c<\/p>\n","protected":false},"author":2,"featured_media":87029,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[84,55,3419,70],"topic":[],"class_list":["post-87030","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-server","tag-android","tag-c","tag-c23","tag-ide"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>C++23 \u65b0\u7279\u6027\u5728 CLion \u4e2d\u7684\u5b9e\u6218\u4f53\u9a8c\u4e0e\u9002\u914d\u8bc4\u6d4b - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/87030.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C++23 \u65b0\u7279\u6027\u5728 CLion \u4e2d\u7684\u5b9e\u6218\u4f53\u9a8c\u4e0e\u9002\u914d\u8bc4\u6d4b - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"C23 \u65b0\u7279\u6027\u5728 CLion \u4e2d\u7684\u5b9e\u6218\u4f53\u9a8c\u4e0e\u9002\u914d\u8bc4\u6d4b\u6458\u8981\u76ee\u5f55\u4e00\u3001std::expected \u9519\u8bef\u5904\u7406\u673a\u5236\u7684\u4ee3\u7801\u7ea7\u6f14\u793a1.1 \u9707\u64bc\u5bf9\u6bd4&#xff1a;30\u884c\u9519\u8bef\u7801 vs 8\u884c\u94fe\u5f0f\u8c03\u75281.2 Monadic\u7ba1\u9053\u7684\u89c6\u89c9\u51b2\u51fb\u529b1.2.1 \u4e94\u6b65\u9a8c\u8bc1\u7ba1\u9053\u7684\u4f18\u96c5\u5b9e\u73b01.2.2 \u9519\u8bef\u4fe1\u606f\u7684\u81ea\u52a8\u4f20\u64ad\u4e0e\u805a\u54081.2.3 \u4e0eRust Result\u7684\u8bed\u6cd5\u5bf9\u68071.3 \u771f\u5b9e\u573a\u666f&#xff1a;JSON\u914d\u7f6e\u89e3\u6790\u5668\u7684\u5b8c\u6574\u6f14\u793a1.3.1 \u89e3\u6790\u5668\u7684\u7c7b\u578b\u5b89\u5168\u8bbe\u8ba11.4 \u6548\u679c\u4eae\u70b9\u603b\u7ed3\u4e8c\u3001\u534f\u7a0b\u4f18\u5316\u5728 2026.1 \u7248\u672c\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/87030.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-29T09:48:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/07\/20260729094828-6a69cc6ce6c02.jpg\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"53 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/87030.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/87030.html\",\"name\":\"C++23 \u65b0\u7279\u6027\u5728 CLion \u4e2d\u7684\u5b9e\u6218\u4f53\u9a8c\u4e0e\u9002\u914d\u8bc4\u6d4b - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-07-29T09:48:32+00:00\",\"dateModified\":\"2026-07-29T09:48:32+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/87030.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/87030.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/87030.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"C++23 \u65b0\u7279\u6027\u5728 CLion \u4e2d\u7684\u5b9e\u6218\u4f53\u9a8c\u4e0e\u9002\u914d\u8bc4\u6d4b\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"C++23 \u65b0\u7279\u6027\u5728 CLion \u4e2d\u7684\u5b9e\u6218\u4f53\u9a8c\u4e0e\u9002\u914d\u8bc4\u6d4b - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/87030.html","og_locale":"zh_CN","og_type":"article","og_title":"C++23 \u65b0\u7279\u6027\u5728 CLion \u4e2d\u7684\u5b9e\u6218\u4f53\u9a8c\u4e0e\u9002\u914d\u8bc4\u6d4b - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"C23 \u65b0\u7279\u6027\u5728 CLion \u4e2d\u7684\u5b9e\u6218\u4f53\u9a8c\u4e0e\u9002\u914d\u8bc4\u6d4b\u6458\u8981\u76ee\u5f55\u4e00\u3001std::expected \u9519\u8bef\u5904\u7406\u673a\u5236\u7684\u4ee3\u7801\u7ea7\u6f14\u793a1.1 \u9707\u64bc\u5bf9\u6bd4&#xff1a;30\u884c\u9519\u8bef\u7801 vs 8\u884c\u94fe\u5f0f\u8c03\u75281.2 Monadic\u7ba1\u9053\u7684\u89c6\u89c9\u51b2\u51fb\u529b1.2.1 \u4e94\u6b65\u9a8c\u8bc1\u7ba1\u9053\u7684\u4f18\u96c5\u5b9e\u73b01.2.2 \u9519\u8bef\u4fe1\u606f\u7684\u81ea\u52a8\u4f20\u64ad\u4e0e\u805a\u54081.2.3 \u4e0eRust Result\u7684\u8bed\u6cd5\u5bf9\u68071.3 \u771f\u5b9e\u573a\u666f&#xff1a;JSON\u914d\u7f6e\u89e3\u6790\u5668\u7684\u5b8c\u6574\u6f14\u793a1.3.1 \u89e3\u6790\u5668\u7684\u7c7b\u578b\u5b89\u5168\u8bbe\u8ba11.4 \u6548\u679c\u4eae\u70b9\u603b\u7ed3\u4e8c\u3001\u534f\u7a0b\u4f18\u5316\u5728 2026.1 \u7248\u672c","og_url":"https:\/\/www.wsisp.com\/helps\/87030.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-07-29T09:48:32+00:00","og_image":[{"url":"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/07\/20260729094828-6a69cc6ce6c02.jpg"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"53 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/87030.html","url":"https:\/\/www.wsisp.com\/helps\/87030.html","name":"C++23 \u65b0\u7279\u6027\u5728 CLion \u4e2d\u7684\u5b9e\u6218\u4f53\u9a8c\u4e0e\u9002\u914d\u8bc4\u6d4b - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-07-29T09:48:32+00:00","dateModified":"2026-07-29T09:48:32+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/87030.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/87030.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/87030.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"C++23 \u65b0\u7279\u6027\u5728 CLion \u4e2d\u7684\u5b9e\u6218\u4f53\u9a8c\u4e0e\u9002\u914d\u8bc4\u6d4b"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/87030","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=87030"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/87030\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media\/87029"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=87030"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=87030"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=87030"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=87030"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}