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