[{"data":1,"prerenderedAt":10367},["ShallowReactive",2],{"wiki-page-/wiki/2023-10-05-cplusplus-jiao-xue/ch10-xian-dai-c":3,"wiki-doc-items-/wiki/2023-10-05-cplusplus-jiao-xue/ch10-xian-dai-c":10314},{"id":4,"title":5,"body":6,"chapter":4543,"chapterSort":10301,"date":10302,"description":12,"docKey":10303,"docRoot":10304,"docTitle":10305,"extension":10306,"isWikiDoc":902,"isWikiIndex":10307,"layout":10308,"meta":10309,"navigation":902,"path":10310,"seo":10311,"stem":10312,"wikiDepth":47,"__hash__":10313},"content/wiki/2023-10-05-Cplusplus教学/ch10-现代C++.md","现代C++",{"type":7,"value":8,"toc":10287},"minimark",[9,13,16,20,28,31,34,88,92,95,750,754,763,766,776,785,808,811,815,821,824,843,849,915,918,921,1078,1081,1088,1102,1191,1197,1202,1205,1209,1233,1320,1325,1341,1406,1412,1415,1492,1496,1501,1554,1562,1654,1659,1664,1924,1928,1931,1938,1941,1944,2032,2038,2064,2134,2137,2140,2322,2327,2330,2541,2544,2549,2552,2561,2832,2835,2926,2930,2933,2936,3152,3155,3160,3165,3168,3399,3404,3409,3460,3466,3469,3475,3481,3800,3803,4111,4116,4274,4279,4293,4300,4317,4320,4341,4345,4348,4357,4392,4395,4405,4413,4416,4421,4623,4628,4633,4636,4887,4892,4897,4900,4906,5182,5187,5190,5197,5200,5203,5215,5218,5222,5229,5235,5238,5450,5455,5465,5475,5766,5771,5776,6059,6064,6067,6074,6080,6306,6310,6313,6322,6328,6348,6418,6428,6483,6486,6489,6496,6594,6600,6728,6731,6734,6737,6771,6776,6783,6797,6805,6811,6885,6888,7334,7339,7342,7345,7348,7351,7357,7360,7369,7377,7399,7402,7405,7414,7423,7457,7470,7484,7487,7495,7505,7514,7528,7536,7561,7564,7875,7880,7888,7901,7931,7999,8181,8186,8189,8194,8421,8426,8431,8664,8669,8674,8985,8989,8992,9010,9013,9495,9500,9503,9506,9509,9519,9524,9550,9563,9570,9606,9616,9622,9632,9750,9755,9761,10278,10283],[10,11,12],"p",{},"\"现代C++\"（Modern C++）指的是自 C++11 标准以来，C++ 语言的一系列重要更新和改进。现代 C++ 的目标是使代码更加简洁、安全、高效，并增强语言的功能。C++11、C++14、C++17、C++20 、C++23以及未来的C++26 标准，都包含了这些特性。",[10,14,15],{},"由于现代C++体系太过于庞大，本章只讲非常常用的现代C++的功能，其他你认为有用的功能请自学，你也可以把你认为很有用的功能补充在本文。",[17,18,19],"h3",{"id":19},"自动类型推导",[10,21,22,23,27],{},"通过使用 ",[24,25,26],"code",{},"auto"," 关键字，编译器可以推断变量的类型，从而减少显式类型声明的冗余。(类似于Python)",[10,29,30],{},"这常用于那种返回值类型很复杂很长的情况，在ROS2中常用。",[10,32,33],{},"简单示例：",[35,36,41],"pre",{"className":37,"code":38,"language":39,"meta":40,"style":40},"language-cpp shiki shiki-themes github-light github-dark","auto x = 42; // 自动推导为 int 类型\nauto str = \"Hello\"; // 推导为 const char*\n","cpp","",[24,42,43,69],{"__ignoreMap":40},[44,45,48,51,55,58,62,65],"span",{"class":46,"line":47},"line",1,[44,49,26],{"class":50},"szBVR",[44,52,54],{"class":53},"sVt8B"," x ",[44,56,57],{"class":50},"=",[44,59,61],{"class":60},"sj4cs"," 42",[44,63,64],{"class":53},";",[44,66,68],{"class":67},"sJ8bj"," // 自动推导为 int 类型\n",[44,70,72,74,77,79,83,85],{"class":46,"line":71},2,[44,73,26],{"class":50},[44,75,76],{"class":53}," str ",[44,78,57],{"class":50},[44,80,82],{"class":81},"sZZnC"," \"Hello\"",[44,84,64],{"class":53},[44,86,87],{"class":67}," // 推导为 const char*\n",[17,89,91],{"id":90},"stdprint这是cc在c23新添加的功能来自print头文件类似-python-的-print","std::print这是C/C++在C++23新添加的功能,（来自print头文件，类似 Python 的 print）。",[10,93,94],{},"运行速度最快 → 最慢：\nstd::print ≈ fmt::print > printf > std::cout（关闭同步） > std::cout（默认） > std::endl",[96,97,98,136],"ol",{},[99,100,101,102,105,106,108,109,111,112,114,115,117,118,120,121,123,124,126,127,129,130,132,133,135],"li",{},"特点:\n因为它本质上是 C++ 标准把 {fmt} 库（fmtlib）正式吸收进来。",[103,104],"br",{},"fmt 库以极高性能著称，特性包括：",[103,107],{},"✔ 零开销抽象（zero overhead）",[103,110],{},"模板 + 智能优化，生成的代码非常紧凑。",[103,113],{},"✔ 直接写到 OS buffer",[103,116],{},"不像 cout 那样层层包装和同步机制。",[103,119],{},"✔ 没有 printf 的可变参数开销",[103,122],{},"printf 要解析格式字符串，是运行时开销；\nstd::print 在编译期做了大量优化。",[103,125],{},"✔ 无需同步 C stdio",[103,128],{},"和 cout 不同，它默认不做同步。",[103,131],{},"✔ 类型安全且格式强大",[103,134],{},"性能比 printf 更高，但无格式化字符串崩溃风险。",[99,137,138,139,144,234,239,306,311,382,387,477,482,557,562,672,677],{},"使用方法",[96,140,141],{},[99,142,143],{},"打印一串字符串\nstd::print 会直接将字符串输出到标准输出（stdout），不会自动换行。",[35,145,147],{"className":37,"code":146,"language":39,"meta":40,"style":40},"#include \u003Cprint>\nint main(int argc,char **argv)\n{\n    std::print(\"Hello, world!\");\n    return 0;\n}\n",[24,148,149,157,190,196,216,228],{"__ignoreMap":40},[44,150,151,154],{"class":46,"line":47},[44,152,153],{"class":50},"#include",[44,155,156],{"class":81}," \u003Cprint>\n",[44,158,159,162,166,169,171,175,178,181,184,187],{"class":46,"line":71},[44,160,161],{"class":50},"int",[44,163,165],{"class":164},"sScJk"," main",[44,167,168],{"class":53},"(",[44,170,161],{"class":50},[44,172,174],{"class":173},"s4XuR"," argc",[44,176,177],{"class":53},",",[44,179,180],{"class":50},"char",[44,182,183],{"class":50}," **",[44,185,186],{"class":173},"argv",[44,188,189],{"class":53},")\n",[44,191,193],{"class":46,"line":192},3,[44,194,195],{"class":53},"{\n",[44,197,199,202,205,208,210,213],{"class":46,"line":198},4,[44,200,201],{"class":164},"    std",[44,203,204],{"class":53},"::",[44,206,207],{"class":164},"print",[44,209,168],{"class":53},[44,211,212],{"class":81},"\"Hello, world!\"",[44,214,215],{"class":53},");\n",[44,217,219,222,225],{"class":46,"line":218},5,[44,220,221],{"class":50},"    return",[44,223,224],{"class":60}," 0",[44,226,227],{"class":53},";\n",[44,229,231],{"class":46,"line":230},6,[44,232,233],{"class":53},"}\n",[96,235,236],{"start":71},[99,237,238],{},"打印并自动换行：std::println",[35,240,242],{"className":37,"code":241,"language":39,"meta":40,"style":40},"#include \u003Cprint>\n int main(int argc,char **argv)\n {\n     std::println(std::cout, \"HelloWorld!\");\n }\n",[24,243,244,250,273,278,301],{"__ignoreMap":40},[44,245,246,248],{"class":46,"line":47},[44,247,153],{"class":50},[44,249,156],{"class":81},[44,251,252,255,257,259,261,263,265,267,269,271],{"class":46,"line":71},[44,253,254],{"class":50}," int",[44,256,165],{"class":164},[44,258,168],{"class":53},[44,260,161],{"class":50},[44,262,174],{"class":173},[44,264,177],{"class":53},[44,266,180],{"class":50},[44,268,183],{"class":50},[44,270,186],{"class":173},[44,272,189],{"class":53},[44,274,275],{"class":46,"line":192},[44,276,277],{"class":53}," {\n",[44,279,280,283,285,288,290,293,296,299],{"class":46,"line":198},[44,281,282],{"class":164},"     std",[44,284,204],{"class":53},[44,286,287],{"class":164},"println",[44,289,168],{"class":53},[44,291,292],{"class":164},"std",[44,294,295],{"class":53},"::cout, ",[44,297,298],{"class":81},"\"HelloWorld!\"",[44,300,215],{"class":53},[44,302,303],{"class":46,"line":218},[44,304,305],{"class":53}," }\n",[96,307,308],{"start":192},[99,309,310],{},"打印一个变量\n{} 是占位符，会被变量自动格式化。",[35,312,314],{"className":37,"code":313,"language":39,"meta":40,"style":40},"#include \u003Cprint>\n int main(int argc,char **argv)\n {\n     int value = 42;\n     std::print(\"value = {}\", value);\n }\n",[24,315,316,322,344,348,362,378],{"__ignoreMap":40},[44,317,318,320],{"class":46,"line":47},[44,319,153],{"class":50},[44,321,156],{"class":81},[44,323,324,326,328,330,332,334,336,338,340,342],{"class":46,"line":71},[44,325,254],{"class":50},[44,327,165],{"class":164},[44,329,168],{"class":53},[44,331,161],{"class":50},[44,333,174],{"class":173},[44,335,177],{"class":53},[44,337,180],{"class":50},[44,339,183],{"class":50},[44,341,186],{"class":173},[44,343,189],{"class":53},[44,345,346],{"class":46,"line":192},[44,347,277],{"class":53},[44,349,350,353,356,358,360],{"class":46,"line":198},[44,351,352],{"class":50},"     int",[44,354,355],{"class":53}," value ",[44,357,57],{"class":50},[44,359,61],{"class":60},[44,361,227],{"class":53},[44,363,364,366,368,370,372,375],{"class":46,"line":218},[44,365,282],{"class":164},[44,367,204],{"class":53},[44,369,207],{"class":164},[44,371,168],{"class":53},[44,373,374],{"class":81},"\"value = {}\"",[44,376,377],{"class":53},", value);\n",[44,379,380],{"class":46,"line":230},[44,381,305],{"class":53},[96,383,384],{"start":198},[99,385,386],{},"打印多个变量",[35,388,390],{"className":37,"code":389,"language":39,"meta":40,"style":40},"#include \u003Cprint>\n int main(int argc,char **argv)\n {\n     int a = 10;\n     float b = 3.14f;\n     std::print(\"a = {}, b = {}\", a, b);\n }\n",[24,391,392,398,420,424,438,456,472],{"__ignoreMap":40},[44,393,394,396],{"class":46,"line":47},[44,395,153],{"class":50},[44,397,156],{"class":81},[44,399,400,402,404,406,408,410,412,414,416,418],{"class":46,"line":71},[44,401,254],{"class":50},[44,403,165],{"class":164},[44,405,168],{"class":53},[44,407,161],{"class":50},[44,409,174],{"class":173},[44,411,177],{"class":53},[44,413,180],{"class":50},[44,415,183],{"class":50},[44,417,186],{"class":173},[44,419,189],{"class":53},[44,421,422],{"class":46,"line":192},[44,423,277],{"class":53},[44,425,426,428,431,433,436],{"class":46,"line":198},[44,427,352],{"class":50},[44,429,430],{"class":53}," a ",[44,432,57],{"class":50},[44,434,435],{"class":60}," 10",[44,437,227],{"class":53},[44,439,440,443,446,448,451,454],{"class":46,"line":218},[44,441,442],{"class":50},"     float",[44,444,445],{"class":53}," b ",[44,447,57],{"class":50},[44,449,450],{"class":60}," 3.14",[44,452,453],{"class":50},"f",[44,455,227],{"class":53},[44,457,458,460,462,464,466,469],{"class":46,"line":230},[44,459,282],{"class":164},[44,461,204],{"class":53},[44,463,207],{"class":164},[44,465,168],{"class":53},[44,467,468],{"class":81},"\"a = {}, b = {}\"",[44,470,471],{"class":53},", a, b);\n",[44,473,475],{"class":46,"line":474},7,[44,476,305],{"class":53},[96,478,479],{"start":218},[99,480,481],{},"控制小数点输出",[35,483,485],{"className":37,"code":484,"language":39,"meta":40,"style":40},"#include \u003Cprint>\n int main(int argc,char **argv)\n {\n     double pi = 3.1415926;\n     std::print(\"pi = {:.2f}\", pi);  // 输出：pi = 3.14\n }\n",[24,486,487,493,515,519,534,553],{"__ignoreMap":40},[44,488,489,491],{"class":46,"line":47},[44,490,153],{"class":50},[44,492,156],{"class":81},[44,494,495,497,499,501,503,505,507,509,511,513],{"class":46,"line":71},[44,496,254],{"class":50},[44,498,165],{"class":164},[44,500,168],{"class":53},[44,502,161],{"class":50},[44,504,174],{"class":173},[44,506,177],{"class":53},[44,508,180],{"class":50},[44,510,183],{"class":50},[44,512,186],{"class":173},[44,514,189],{"class":53},[44,516,517],{"class":46,"line":192},[44,518,277],{"class":53},[44,520,521,524,527,529,532],{"class":46,"line":198},[44,522,523],{"class":50},"     double",[44,525,526],{"class":53}," pi ",[44,528,57],{"class":50},[44,530,531],{"class":60}," 3.1415926",[44,533,227],{"class":53},[44,535,536,538,540,542,544,547,550],{"class":46,"line":218},[44,537,282],{"class":164},[44,539,204],{"class":53},[44,541,207],{"class":164},[44,543,168],{"class":53},[44,545,546],{"class":81},"\"pi = {:.2f}\"",[44,548,549],{"class":53},", pi);",[44,551,552],{"class":67},"  // 输出：pi = 3.14\n",[44,554,555],{"class":46,"line":230},[44,556,305],{"class":53},[96,558,559],{"start":230},[99,560,561],{},"对齐方式（左对齐 / 右对齐 / 居中）",[35,563,565],{"className":37,"code":564,"language":39,"meta":40,"style":40},"#include \u003Cprint>\n int main(int argc,char **argv)\n {\n     std::print(\"[{:>10}]\", 42);  // 右对齐\n     std::print(\"[{:\u003C10}]\", 42);  // 左对齐\n     std::print(\"[{:^10}]\", 42);  // 居中\n }\n",[24,566,567,573,595,599,624,646,668],{"__ignoreMap":40},[44,568,569,571],{"class":46,"line":47},[44,570,153],{"class":50},[44,572,156],{"class":81},[44,574,575,577,579,581,583,585,587,589,591,593],{"class":46,"line":71},[44,576,254],{"class":50},[44,578,165],{"class":164},[44,580,168],{"class":53},[44,582,161],{"class":50},[44,584,174],{"class":173},[44,586,177],{"class":53},[44,588,180],{"class":50},[44,590,183],{"class":50},[44,592,186],{"class":173},[44,594,189],{"class":53},[44,596,597],{"class":46,"line":192},[44,598,277],{"class":53},[44,600,601,603,605,607,609,612,615,618,621],{"class":46,"line":198},[44,602,282],{"class":164},[44,604,204],{"class":53},[44,606,207],{"class":164},[44,608,168],{"class":53},[44,610,611],{"class":81},"\"[{:>10}]\"",[44,613,614],{"class":53},", ",[44,616,617],{"class":60},"42",[44,619,620],{"class":53},");",[44,622,623],{"class":67},"  // 右对齐\n",[44,625,626,628,630,632,634,637,639,641,643],{"class":46,"line":218},[44,627,282],{"class":164},[44,629,204],{"class":53},[44,631,207],{"class":164},[44,633,168],{"class":53},[44,635,636],{"class":81},"\"[{:\u003C10}]\"",[44,638,614],{"class":53},[44,640,617],{"class":60},[44,642,620],{"class":53},[44,644,645],{"class":67},"  // 左对齐\n",[44,647,648,650,652,654,656,659,661,663,665],{"class":46,"line":230},[44,649,282],{"class":164},[44,651,204],{"class":53},[44,653,207],{"class":164},[44,655,168],{"class":53},[44,657,658],{"class":81},"\"[{:^10}]\"",[44,660,614],{"class":53},[44,662,617],{"class":60},[44,664,620],{"class":53},[44,666,667],{"class":67},"  // 居中\n",[44,669,670],{"class":46,"line":474},[44,671,305],{"class":53},[96,673,674],{"start":474},[99,675,676],{},"打印整数为十六进制\n会加上 0x 前缀。",[35,678,680],{"className":37,"code":679,"language":39,"meta":40,"style":40},"#include \u003Cprint>\n int main(int argc,char **argv)\n {\n     int x = 255;\n     std::print(\"hex = {:#x}\", x);   // 输出：hex = 0xff\n }\n",[24,681,682,688,710,714,727,746],{"__ignoreMap":40},[44,683,684,686],{"class":46,"line":47},[44,685,153],{"class":50},[44,687,156],{"class":81},[44,689,690,692,694,696,698,700,702,704,706,708],{"class":46,"line":71},[44,691,254],{"class":50},[44,693,165],{"class":164},[44,695,168],{"class":53},[44,697,161],{"class":50},[44,699,174],{"class":173},[44,701,177],{"class":53},[44,703,180],{"class":50},[44,705,183],{"class":50},[44,707,186],{"class":173},[44,709,189],{"class":53},[44,711,712],{"class":46,"line":192},[44,713,277],{"class":53},[44,715,716,718,720,722,725],{"class":46,"line":198},[44,717,352],{"class":50},[44,719,54],{"class":53},[44,721,57],{"class":50},[44,723,724],{"class":60}," 255",[44,726,227],{"class":53},[44,728,729,731,733,735,737,740,743],{"class":46,"line":218},[44,730,282],{"class":164},[44,732,204],{"class":53},[44,734,207],{"class":164},[44,736,168],{"class":53},[44,738,739],{"class":81},"\"hex = {:#x}\"",[44,741,742],{"class":53},", x);",[44,744,745],{"class":67},"   // 输出：hex = 0xff\n",[44,747,748],{"class":46,"line":230},[44,749,305],{"class":53},[17,751,753],{"id":752},"modules模块modules始于c20在c26有了较大的变化","modules模块modules始于C++20，在C++26有了较大的变化。",[10,755,756,757],{},"扩展名为.cppm(社区常用)或.ixx(微软推广)\n",[758,759,760],"a",{"href":760,"rel":761},"https://learn.microsoft.com/zh-cn/cpp/cpp/modules-cpp?view=msvc-170",[762],"nofollow",[17,764,765],{"id":765},"安全空指针",[10,767,768,771,772,775],{},[24,769,770],{},"nullptr"," 是一个类型安全的空指针常量，代替传统的 ",[24,773,774],{},"NULL","，避免了空指针类型不匹配的问题。",[10,777,778,779,781,782,784],{},"主要是有的编译器不会把NULL识别成空指针，所以尽量不要使用",[24,780,774],{},"了，改用更加安全的",[24,783,770],{},"。",[35,786,788],{"className":37,"code":787,"language":39,"meta":40,"style":40},"int* ptr = nullptr;  // 更安全的空指针\n",[24,789,790],{"__ignoreMap":40},[44,791,792,795,798,800,803,805],{"class":46,"line":47},[44,793,794],{"class":50},"int*",[44,796,797],{"class":53}," ptr ",[44,799,57],{"class":50},[44,801,802],{"class":60}," nullptr",[44,804,64],{"class":53},[44,806,807],{"class":67},"  // 更安全的空指针\n",[17,809,810],{"id":810},"智能指针",[812,813,814],"h4",{"id":814},"内存管理",[10,816,817],{},[818,819,820],"strong",{},"new 和 delete 运算符",[10,822,823],{},"下面是使用 new 运算符来为任意的数据类型动态分配内存的通用语法：",[35,825,827],{"className":37,"code":826,"language":39,"meta":40,"style":40},"new data-type;\n",[24,828,829],{"__ignoreMap":40},[44,830,831,834,837,840],{"class":46,"line":47},[44,832,833],{"class":50},"new",[44,835,836],{"class":53}," data",[44,838,839],{"class":50},"-",[44,841,842],{"class":53},"type;\n",[10,844,845,846,848],{},"例如，我们可以定义一个指向 double 类型的指针，然后请求内存，该内存在执行时被分配。我们可以按照下面的语句使用 ",[818,847,833],{}," 运算符来完成这点：",[35,850,852],{"className":37,"code":851,"language":39,"meta":40,"style":40},"double* pvalue  = NULL; // 初始化为 null 的指针   \n//double* pvalue  = nullptr;   //更加安全\npvalue  = new double;   // 为变量请求内存\n\ndelete pvalue;        // 释放 pvalue 所指向的内存，如果用完不释放，则会内存泄漏\n",[24,853,854,872,880,898,904],{"__ignoreMap":40},[44,855,856,859,862,864,867,869],{"class":46,"line":47},[44,857,858],{"class":50},"double*",[44,860,861],{"class":53}," pvalue  ",[44,863,57],{"class":50},[44,865,866],{"class":60}," NULL",[44,868,64],{"class":53},[44,870,871],{"class":67}," // 初始化为 null 的指针   \n",[44,873,874,877],{"class":46,"line":71},[44,875,876],{"class":67},"//double* pvalue  = nullptr;",[44,878,879],{"class":67},"   //更加安全\n",[44,881,882,885,887,890,893,895],{"class":46,"line":192},[44,883,884],{"class":53},"pvalue  ",[44,886,57],{"class":50},[44,888,889],{"class":50}," new",[44,891,892],{"class":50}," double",[44,894,64],{"class":53},[44,896,897],{"class":67},"   // 为变量请求内存\n",[44,899,900],{"class":46,"line":198},[44,901,903],{"emptyLinePlaceholder":902},true,"\n",[44,905,906,909,912],{"class":46,"line":218},[44,907,908],{"class":50},"delete",[44,910,911],{"class":53}," pvalue;",[44,913,914],{"class":67},"        // 释放 pvalue 所指向的内存，如果用完不释放，则会内存泄漏\n",[10,916,917],{},"在某些情况下编译器会把NULL和int搞混，",[10,919,920],{},"所以用nullptr更为安全。（现代C++）",[35,922,924],{"className":37,"code":923,"language":39,"meta":40,"style":40},"#include \u003Ciostream>\nusing namespace std;\n\nint main ()\n{\n   double* pvalue  = nulltr; // 初始化为 null 的指针\n   pvalue  = new double;   // 为变量请求内存\n\n   *pvalue = 29494.99;     // 在分配的地址存储值\n   cout \u003C\u003C \"Value of pvalue : \" \u003C\u003C *pvalue \u003C\u003C endl;\n\n   delete pvalue;         // 释放内存，否则内存泄漏\n\n   return 0;\n}\n",[24,925,926,933,946,950,959,963,978,993,998,1017,1042,1047,1058,1063,1073],{"__ignoreMap":40},[44,927,928,930],{"class":46,"line":47},[44,929,153],{"class":50},[44,931,932],{"class":81}," \u003Ciostream>\n",[44,934,935,938,941,944],{"class":46,"line":71},[44,936,937],{"class":50},"using",[44,939,940],{"class":50}," namespace",[44,942,943],{"class":164}," std",[44,945,227],{"class":53},[44,947,948],{"class":46,"line":192},[44,949,903],{"emptyLinePlaceholder":902},[44,951,952,954,956],{"class":46,"line":198},[44,953,161],{"class":50},[44,955,165],{"class":164},[44,957,958],{"class":53}," ()\n",[44,960,961],{"class":46,"line":218},[44,962,195],{"class":53},[44,964,965,968,970,972,975],{"class":46,"line":230},[44,966,967],{"class":50},"   double*",[44,969,861],{"class":53},[44,971,57],{"class":50},[44,973,974],{"class":53}," nulltr;",[44,976,977],{"class":67}," // 初始化为 null 的指针\n",[44,979,980,983,985,987,989,991],{"class":46,"line":474},[44,981,982],{"class":53},"   pvalue  ",[44,984,57],{"class":50},[44,986,889],{"class":50},[44,988,892],{"class":50},[44,990,64],{"class":53},[44,992,897],{"class":67},[44,994,996],{"class":46,"line":995},8,[44,997,903],{"emptyLinePlaceholder":902},[44,999,1001,1004,1007,1009,1012,1014],{"class":46,"line":1000},9,[44,1002,1003],{"class":50},"   *",[44,1005,1006],{"class":53},"pvalue ",[44,1008,57],{"class":50},[44,1010,1011],{"class":60}," 29494.99",[44,1013,64],{"class":53},[44,1015,1016],{"class":67},"     // 在分配的地址存储值\n",[44,1018,1020,1023,1026,1029,1032,1035,1037,1039],{"class":46,"line":1019},10,[44,1021,1022],{"class":53},"   cout ",[44,1024,1025],{"class":50},"\u003C\u003C",[44,1027,1028],{"class":81}," \"Value of pvalue : \"",[44,1030,1031],{"class":50}," \u003C\u003C",[44,1033,1034],{"class":50}," *",[44,1036,1006],{"class":53},[44,1038,1025],{"class":50},[44,1040,1041],{"class":53}," endl;\n",[44,1043,1045],{"class":46,"line":1044},11,[44,1046,903],{"emptyLinePlaceholder":902},[44,1048,1050,1053,1055],{"class":46,"line":1049},12,[44,1051,1052],{"class":50},"   delete",[44,1054,911],{"class":53},[44,1056,1057],{"class":67},"         // 释放内存，否则内存泄漏\n",[44,1059,1061],{"class":46,"line":1060},13,[44,1062,903],{"emptyLinePlaceholder":902},[44,1064,1066,1069,1071],{"class":46,"line":1065},14,[44,1067,1068],{"class":50},"   return",[44,1070,224],{"class":60},[44,1072,227],{"class":53},[44,1074,1076],{"class":46,"line":1075},15,[44,1077,233],{"class":53},[812,1079,1080],{"id":1080},"智能指针的类型",[10,1082,1083,1084],{},"参考资料：",[758,1085,1086],{"href":1086,"rel":1087},"https://learn.microsoft.com/zh-cn/cpp/cpp/smart-pointers-modern-cpp?view=msvc-170&source=recommendations",[762],[10,1089,1090,1091,1098,1099,1101],{},"智能指针是在 ",[758,1092,1095],{"href":1093,"rel":1094},"https://learn.microsoft.com/zh-cn/cpp/standard-library/memory?view=msvc-170",[762],[1096,1097],"memory",{}," 头文件中的 ",[24,1100,292],{}," 命名空间中定义的。",[1103,1104,1105,1141,1161],"ul",{},[99,1106,1107,1110,1111,1114,1115,1118,1119,1122,1123,1125,1126,1129,1130,1135,1136,784],{},[24,1108,1109],{},"unique_ptr"," 只允许基础指针的一个所有者。 除非你确信需要 ",[24,1112,1113],{},"shared_ptr","，否则请将该指针用作 POCO 的默认选项。 可以移到新所有者，但不会复制或共享。 替换已弃用的 ",[24,1116,1117],{},"auto_ptr","。 与 ",[24,1120,1121],{},"boost::scoped_ptr"," 比较。 ",[24,1124,1109],{}," 小巧高效；大小等同于一个指针且支持 rvalue 引用，从而可实现快速插入和对 C++ 标准库集合的检索。 头文件：",[24,1127,1128],{},"\u003Cmemory>","。 有关详细信息，请参阅",[758,1131,1134],{"href":1132,"rel":1133},"https://learn.microsoft.com/zh-cn/cpp/cpp/how-to-create-and-use-unique-ptr-instances?view=msvc-170",[762],"如何：创建和使用 unique_ptr 实例","和 ",[758,1137,1140],{"href":1138,"rel":1139},"https://learn.microsoft.com/zh-cn/cpp/standard-library/unique-ptr-class?view=msvc-170",[762],"unique_ptr 类",[99,1142,1143,1145,1146,1148,1149,1129,1151,1135,1156,784],{},[24,1144,1113],{}," 采用引用计数的智能指针。 如果你想要将一个原始指针分配给多个所有者（例如，从容器返回了指针副本又想保留原始指针时），请使用该指针。 直至所有 ",[24,1147,1113],{}," 所有者超出了范围或放弃所有权，才会删除原始指针。 大小为两个指针；一个用于对象，另一个用于包含引用计数的共享控制块。 头文件：",[24,1150,1128],{},[758,1152,1155],{"href":1153,"rel":1154},"https://learn.microsoft.com/zh-cn/cpp/cpp/how-to-create-and-use-shared-ptr-instances?view=msvc-170",[762],"如何：创建和使用 shared_ptr 实例",[758,1157,1160],{"href":1158,"rel":1159},"https://learn.microsoft.com/zh-cn/cpp/standard-library/shared-ptr-class?view=msvc-170",[762],"shared_ptr 类",[99,1162,1163,1166,1167,1169,1170,1172,1173,1175,1176,1178,1179,1129,1181,1135,1186,784],{},[24,1164,1165],{},"weak_ptr"," 结合 ",[24,1168,1113],{}," 使用的特例智能指针。 ",[24,1171,1165],{}," 提供对一个或多个 ",[24,1174,1113],{}," 实例拥有的对象的访问，但不参与引用计数。 如果你想要观察某个对象但不需要其保持活动状态，请使用该实例。 在某些情况下，需要断开 ",[24,1177,1113],{}," 实例间的循环引用。 头文件：",[24,1180,1128],{},[758,1182,1185],{"href":1183,"rel":1184},"https://learn.microsoft.com/zh-cn/cpp/cpp/how-to-create-and-use-weak-ptr-instances?view=msvc-170",[762],"如何：创建和使用 weak_ptr 实例",[758,1187,1190],{"href":1188,"rel":1189},"https://learn.microsoft.com/zh-cn/cpp/standard-library/weak-ptr-class?view=msvc-170",[762],"weak_ptr 类",[10,1192,1193],{},[1194,1195],"img",{"alt":40,"src":1196},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/10/05/image5.webp",[10,1198,1199],{},[1194,1200],{"alt":40,"src":1201},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/10/05/image6.webp",[10,1203,1204],{},"当没有指向该内存的，程序会自动释放内存。",[812,1206,1208],{"id":1207},"如何创建和使用-shared_ptr-实例","如何创建和使用 shared_ptr 实例",[10,1210,1211,1212,1217,1218,1220,1221,1223,1224,1226,1227,1229,1230,1232],{},"第一次创建内存资源时，请使用 ",[758,1213,1216],{"href":1214,"rel":1215},"https://learn.microsoft.com/zh-cn/cpp/standard-library/memory-functions?view=msvc-170#make_shared",[762],"make_shared"," 函数创建 ",[24,1219,1113],{},"。 ",[24,1222,1216],{}," 异常安全。 它使用同一调用为控制块和资源分配内存，这会减少构造开销。 如果不使用 ",[24,1225,1216],{},"，则必须先使用显式 ",[24,1228,833],{}," 表达式来创建对象，然后才能将其传递到 ",[24,1231,1113],{}," 构造函数。",[35,1234,1236],{"className":37,"code":1235,"language":39,"meta":40,"style":40},"//记得引头文件\n#include \u003Cmemory>\n//下行是微软官方例子\nauto ptr_name = std::make_shared\u003Ctemplate>();\n//下方为实例\nauto struct_pointer = std::make_shared\u003Cstruct Books>();\nstruct_pointer->title;\n(*struct_pointer).title;\n",[24,1237,1238,1243,1250,1255,1273,1278,1305,1310],{"__ignoreMap":40},[44,1239,1240],{"class":46,"line":47},[44,1241,1242],{"class":67},"//记得引头文件\n",[44,1244,1245,1247],{"class":46,"line":71},[44,1246,153],{"class":50},[44,1248,1249],{"class":81}," \u003Cmemory>\n",[44,1251,1252],{"class":46,"line":192},[44,1253,1254],{"class":67},"//下行是微软官方例子\n",[44,1256,1257,1259,1262,1264,1266,1268,1270],{"class":46,"line":198},[44,1258,26],{"class":50},[44,1260,1261],{"class":53}," ptr_name ",[44,1263,57],{"class":50},[44,1265,943],{"class":164},[44,1267,204],{"class":53},[44,1269,1216],{"class":164},[44,1271,1272],{"class":53},"\u003Ctemplate>();\n",[44,1274,1275],{"class":46,"line":218},[44,1276,1277],{"class":67},"//下方为实例\n",[44,1279,1280,1282,1285,1287,1289,1291,1293,1296,1299,1302],{"class":46,"line":230},[44,1281,26],{"class":50},[44,1283,1284],{"class":53}," struct_pointer ",[44,1286,57],{"class":50},[44,1288,943],{"class":164},[44,1290,204],{"class":53},[44,1292,1216],{"class":164},[44,1294,1295],{"class":53},"\u003C",[44,1297,1298],{"class":50},"struct",[44,1300,1301],{"class":164}," Books",[44,1303,1304],{"class":53},">();\n",[44,1306,1307],{"class":46,"line":474},[44,1308,1309],{"class":53},"struct_pointer->title;\n",[44,1311,1312,1314,1317],{"class":46,"line":995},[44,1313,168],{"class":53},[44,1315,1316],{"class":50},"*",[44,1318,1319],{"class":53},"struct_pointer).title;\n",[17,1321,1323],{"id":1322},"右值引用和移动语义",[818,1324,1322],{},[10,1326,1327,1334,1335,1340],{},[818,1328,1329,1330,1333],{},"右值引用（",[24,1331,1332],{},"&&","）"," 和 ",[818,1336,1337],{},[24,1338,1339],{},"std::move"," 使得对象的资源可以被移动而不是复制，提高了性能，尤其是在容器类和资源管理类中。",[35,1342,1344],{"className":37,"code":1343,"language":39,"meta":40,"style":40},"std::vector\u003Cint> v1 = {1, 2, 3};\nstd::vector\u003Cint> v2 = std::move(v1); // 移动 v1 的数据到 v2\n",[24,1345,1346,1380],{"__ignoreMap":40},[44,1347,1348,1350,1353,1356,1359,1361,1364,1367,1369,1372,1374,1377],{"class":46,"line":47},[44,1349,292],{"class":164},[44,1351,1352],{"class":53},"::vector",[44,1354,1355],{"class":50},"\u003Cint>",[44,1357,1358],{"class":53}," v1 ",[44,1360,57],{"class":50},[44,1362,1363],{"class":53}," {",[44,1365,1366],{"class":60},"1",[44,1368,614],{"class":53},[44,1370,1371],{"class":60},"2",[44,1373,614],{"class":53},[44,1375,1376],{"class":60},"3",[44,1378,1379],{"class":53},"};\n",[44,1381,1382,1384,1386,1388,1391,1393,1395,1397,1400,1403],{"class":46,"line":71},[44,1383,292],{"class":164},[44,1385,1352],{"class":53},[44,1387,1355],{"class":50},[44,1389,1390],{"class":53}," v2 ",[44,1392,57],{"class":50},[44,1394,943],{"class":164},[44,1396,204],{"class":53},[44,1398,1399],{"class":164},"move",[44,1401,1402],{"class":53},"(v1);",[44,1404,1405],{"class":67}," // 移动 v1 的数据到 v2\n",[17,1407,1409],{"id":1408},"范围-for-循环",[818,1410,1411],{},"范围 for 循环",[10,1413,1414],{},"范围 for 循环（Range-based for loop）用于简化迭代容器的代码。",[35,1416,1418],{"className":37,"code":1417,"language":39,"meta":40,"style":40},"std::vector\u003Cint> v = {1, 2, 3, 4};\nfor (int n : v) \n{\n    std::cout \u003C\u003C n \u003C\u003C std::endl;\n}\n",[24,1419,1420,1452,1465,1469,1488],{"__ignoreMap":40},[44,1421,1422,1424,1426,1428,1431,1433,1435,1437,1439,1441,1443,1445,1447,1450],{"class":46,"line":47},[44,1423,292],{"class":164},[44,1425,1352],{"class":53},[44,1427,1355],{"class":50},[44,1429,1430],{"class":53}," v ",[44,1432,57],{"class":50},[44,1434,1363],{"class":53},[44,1436,1366],{"class":60},[44,1438,614],{"class":53},[44,1440,1371],{"class":60},[44,1442,614],{"class":53},[44,1444,1376],{"class":60},[44,1446,614],{"class":53},[44,1448,1449],{"class":60},"4",[44,1451,1379],{"class":53},[44,1453,1454,1457,1460,1462],{"class":46,"line":71},[44,1455,1456],{"class":50},"for",[44,1458,1459],{"class":53}," (",[44,1461,161],{"class":50},[44,1463,1464],{"class":53}," n : v) \n",[44,1466,1467],{"class":46,"line":192},[44,1468,195],{"class":53},[44,1470,1471,1473,1476,1478,1481,1483,1485],{"class":46,"line":198},[44,1472,201],{"class":164},[44,1474,1475],{"class":53},"::cout ",[44,1477,1025],{"class":50},[44,1479,1480],{"class":53}," n ",[44,1482,1025],{"class":50},[44,1484,943],{"class":164},[44,1486,1487],{"class":53},"::endl;\n",[44,1489,1490],{"class":46,"line":218},[44,1491,233],{"class":53},[17,1493,1495],{"id":1494},"constexpr","Constexpr",[10,1497,1498,1500],{},[24,1499,1494],{},"是从C++11开始引入的新特性，在后续的好几个C++版本做出了增强：",[1502,1503,1504,1518],"table",{},[1505,1506,1507],"thead",{},[1508,1509,1510,1515],"tr",{},[1511,1512,1514],"th",{"align":1513},"left","标准版本",[1511,1516,1517],{"align":1513},"constexpr 相关支持",[1519,1520,1521,1530,1538,1546],"tbody",{},[1508,1522,1523,1527],{},[1524,1525,1526],"td",{"align":1513},"C++11",[1524,1528,1529],{"align":1513},"支持 constexpr 变量和简单函数",[1508,1531,1532,1535],{},[1524,1533,1534],{"align":1513},"C++14",[1524,1536,1537],{"align":1513},"constexpr 函数支持更多语句和循环",[1508,1539,1540,1543],{},[1524,1541,1542],{"align":1513},"C++17",[1524,1544,1545],{"align":1513},"支持 constexpr lambda，更多扩展",[1508,1547,1548,1551],{},[1524,1549,1550],{"align":1513},"C++20",[1524,1552,1553],{"align":1513},"consteval 和更强的 constexpr",[10,1555,1556,1334,1559,1561],{},[24,1557,1558],{},"const",[24,1560,1494],{}," 虽然都表示“不可变”，但本质和用途有明显区别，给你一份简明对比：",[1502,1563,1564,1575],{},[1505,1565,1566],{},[1508,1567,1568,1571,1573],{},[1511,1569,1570],{"align":1513},"方面",[1511,1572,1558],{"align":1513},[1511,1574,1494],{"align":1513},[1519,1576,1577,1588,1599,1610,1621,1632,1643],{},[1508,1578,1579,1582,1585],{},[1524,1580,1581],{"align":1513},"含义",[1524,1583,1584],{"align":1513},"对象不可修改",[1524,1586,1587],{"align":1513},"表示值或函数可以在编译期求值",[1508,1589,1590,1593,1596],{},[1524,1591,1592],{"align":1513},"变量修饰",[1524,1594,1595],{"align":1513},"变量值不可变，但不保证编译期计算",[1524,1597,1598],{"align":1513},"变量必须是编译期常量",[1508,1600,1601,1604,1607],{},[1524,1602,1603],{"align":1513},"函数修饰",[1524,1605,1606],{"align":1513},"不用于函数（只能修饰成员函数）",[1524,1608,1609],{"align":1513},"函数可在编译期执行",[1508,1611,1612,1615,1618],{},[1524,1613,1614],{"align":1513},"初始化要求",[1524,1616,1617],{"align":1513},"可以在运行时初始化",[1524,1619,1620],{"align":1513},"必须在编译时初始化",[1508,1622,1623,1626,1629],{},[1524,1624,1625],{"align":1513},"用途",[1524,1627,1628],{"align":1513},"防止变量被修改",[1524,1630,1631],{"align":1513},"做编译期计算，提高效率",[1508,1633,1634,1637,1640],{},[1524,1635,1636],{"align":1513},"示例",[1524,1638,1639],{"align":1513},"const int x = 5;",[1524,1641,1642],{"align":1513},"constexpr int x = 5;",[1508,1644,1645,1648,1651],{},[1524,1646,1647],{"align":1513},"函数示例",[1524,1649,1650],{"align":1513},"int f() const;（成员函数常量）",[1524,1652,1653],{"align":1513},"constexpr int f() { return 5; }",[10,1655,1656,1658],{},[24,1657,1558],{}," 强调“值不可改”，运行时或编译时都可用",[10,1660,1661,1663],{},[24,1662,1494],{}," 强调“编译期计算”，只能初始化为编译时常量，函数可做编译期计算",[35,1665,1667],{"className":37,"code":1666,"language":39,"meta":40,"style":40},"#include \u003Ciostream>\n\nconstexpr int square(int n) \n{\n    return n * n;\n}\n\nint main() \n{\n    const int a = 10;  // a 是只读变量，但可以是运行时初始化\n    int x = 5;\n    const int b = x;   // 合法，只要 x 在运行时确定\n\n    constexpr int c = 10;      // c 必须编译期确定\n    // constexpr int d = x;    // 错误，x 不是编译期常量\n\n    int val = 3;\n    const int r1 = square(val);       // OK，但 val 运行时确定，square 运行时计算\n    constexpr int r2 = square(5);     // OK，编译期计算\n\n    std::cout \u003C\u003C \"Press Enter to continue...\";\n    std::cin.get();\n    return 0;\n}\n\n",[24,1668,1669,1675,1679,1698,1702,1713,1717,1721,1730,1734,1752,1766,1782,1786,1805,1813,1818,1833,1853,1877,1882,1896,1910,1919],{"__ignoreMap":40},[44,1670,1671,1673],{"class":46,"line":47},[44,1672,153],{"class":50},[44,1674,932],{"class":81},[44,1676,1677],{"class":46,"line":71},[44,1678,903],{"emptyLinePlaceholder":902},[44,1680,1681,1683,1685,1688,1690,1692,1695],{"class":46,"line":192},[44,1682,1494],{"class":50},[44,1684,254],{"class":50},[44,1686,1687],{"class":164}," square",[44,1689,168],{"class":53},[44,1691,161],{"class":50},[44,1693,1694],{"class":173}," n",[44,1696,1697],{"class":53},") \n",[44,1699,1700],{"class":46,"line":198},[44,1701,195],{"class":53},[44,1703,1704,1706,1708,1710],{"class":46,"line":218},[44,1705,221],{"class":50},[44,1707,1480],{"class":53},[44,1709,1316],{"class":50},[44,1711,1712],{"class":53}," n;\n",[44,1714,1715],{"class":46,"line":230},[44,1716,233],{"class":53},[44,1718,1719],{"class":46,"line":474},[44,1720,903],{"emptyLinePlaceholder":902},[44,1722,1723,1725,1727],{"class":46,"line":995},[44,1724,161],{"class":50},[44,1726,165],{"class":164},[44,1728,1729],{"class":53},"() \n",[44,1731,1732],{"class":46,"line":1000},[44,1733,195],{"class":53},[44,1735,1736,1739,1741,1743,1745,1747,1749],{"class":46,"line":1019},[44,1737,1738],{"class":50},"    const",[44,1740,254],{"class":50},[44,1742,430],{"class":53},[44,1744,57],{"class":50},[44,1746,435],{"class":60},[44,1748,64],{"class":53},[44,1750,1751],{"class":67},"  // a 是只读变量，但可以是运行时初始化\n",[44,1753,1754,1757,1759,1761,1764],{"class":46,"line":1044},[44,1755,1756],{"class":50},"    int",[44,1758,54],{"class":53},[44,1760,57],{"class":50},[44,1762,1763],{"class":60}," 5",[44,1765,227],{"class":53},[44,1767,1768,1770,1772,1774,1776,1779],{"class":46,"line":1049},[44,1769,1738],{"class":50},[44,1771,254],{"class":50},[44,1773,445],{"class":53},[44,1775,57],{"class":50},[44,1777,1778],{"class":53}," x;",[44,1780,1781],{"class":67},"   // 合法，只要 x 在运行时确定\n",[44,1783,1784],{"class":46,"line":1060},[44,1785,903],{"emptyLinePlaceholder":902},[44,1787,1788,1791,1793,1796,1798,1800,1802],{"class":46,"line":1065},[44,1789,1790],{"class":50},"    constexpr",[44,1792,254],{"class":50},[44,1794,1795],{"class":53}," c ",[44,1797,57],{"class":50},[44,1799,435],{"class":60},[44,1801,64],{"class":53},[44,1803,1804],{"class":67},"      // c 必须编译期确定\n",[44,1806,1807,1810],{"class":46,"line":1075},[44,1808,1809],{"class":67},"    // constexpr int d = x;",[44,1811,1812],{"class":67},"    // 错误，x 不是编译期常量\n",[44,1814,1816],{"class":46,"line":1815},16,[44,1817,903],{"emptyLinePlaceholder":902},[44,1819,1821,1823,1826,1828,1831],{"class":46,"line":1820},17,[44,1822,1756],{"class":50},[44,1824,1825],{"class":53}," val ",[44,1827,57],{"class":50},[44,1829,1830],{"class":60}," 3",[44,1832,227],{"class":53},[44,1834,1836,1838,1840,1843,1845,1847,1850],{"class":46,"line":1835},18,[44,1837,1738],{"class":50},[44,1839,254],{"class":50},[44,1841,1842],{"class":53}," r1 ",[44,1844,57],{"class":50},[44,1846,1687],{"class":164},[44,1848,1849],{"class":53},"(val);",[44,1851,1852],{"class":67},"       // OK，但 val 运行时确定，square 运行时计算\n",[44,1854,1856,1858,1860,1863,1865,1867,1869,1872,1874],{"class":46,"line":1855},19,[44,1857,1790],{"class":50},[44,1859,254],{"class":50},[44,1861,1862],{"class":53}," r2 ",[44,1864,57],{"class":50},[44,1866,1687],{"class":164},[44,1868,168],{"class":53},[44,1870,1871],{"class":60},"5",[44,1873,620],{"class":53},[44,1875,1876],{"class":67},"     // OK，编译期计算\n",[44,1878,1880],{"class":46,"line":1879},20,[44,1881,903],{"emptyLinePlaceholder":902},[44,1883,1885,1887,1889,1891,1894],{"class":46,"line":1884},21,[44,1886,201],{"class":164},[44,1888,1475],{"class":53},[44,1890,1025],{"class":50},[44,1892,1893],{"class":81}," \"Press Enter to continue...\"",[44,1895,227],{"class":53},[44,1897,1899,1901,1904,1907],{"class":46,"line":1898},22,[44,1900,201],{"class":164},[44,1902,1903],{"class":53},"::cin.",[44,1905,1906],{"class":164},"get",[44,1908,1909],{"class":53},"();\n",[44,1911,1913,1915,1917],{"class":46,"line":1912},23,[44,1914,221],{"class":50},[44,1916,224],{"class":60},[44,1918,227],{"class":53},[44,1920,1922],{"class":46,"line":1921},24,[44,1923,233],{"class":53},[17,1925,1927],{"id":1926},"lambda-表达式","Lambda 表达式",[812,1929,1930],{"id":1930},"定义",[10,1932,1933,1934,1937],{},"Lambda表达式，很多人把他叫做 ",[818,1935,1936],{},"匿名内联函数"," ，但是实际上他并不是一个函数，而是一个无名的非联合非聚合的类的类型。",[10,1939,1940],{},"Lambda 表达式会让代码更加的简洁，使得 C++ 支持匿名函数对象，可以在函数内定义小的函数并将其传递给其他函数。",[10,1942,1943],{},"ROS2的一些库使用了该表达式,所以需要学习一下。特别是在回调函数中常用。",[35,1945,1947],{"className":37,"code":1946,"language":39,"meta":40,"style":40},"auto add = [](int a, int b)  -> int\n{ \n    return a + b; \n};\nstd::cout \u003C\u003C add(2, 3) \u003C\u003C std::endl; // 输出 5\n",[24,1948,1949,1979,1984,1996,2000],{"__ignoreMap":40},[44,1950,1951,1953,1956,1958,1961,1963,1966,1968,1970,1973,1976],{"class":46,"line":47},[44,1952,26],{"class":50},[44,1954,1955],{"class":53}," add ",[44,1957,57],{"class":50},[44,1959,1960],{"class":53}," [](",[44,1962,161],{"class":50},[44,1964,1965],{"class":173}," a",[44,1967,614],{"class":53},[44,1969,161],{"class":50},[44,1971,1972],{"class":173}," b",[44,1974,1975],{"class":53},")  -> ",[44,1977,1978],{"class":50},"int\n",[44,1980,1981],{"class":46,"line":71},[44,1982,1983],{"class":53},"{ \n",[44,1985,1986,1988,1990,1993],{"class":46,"line":192},[44,1987,221],{"class":50},[44,1989,430],{"class":53},[44,1991,1992],{"class":50},"+",[44,1994,1995],{"class":53}," b; \n",[44,1997,1998],{"class":46,"line":198},[44,1999,1379],{"class":53},[44,2001,2002,2004,2006,2008,2011,2013,2015,2017,2019,2022,2024,2026,2029],{"class":46,"line":218},[44,2003,292],{"class":164},[44,2005,1475],{"class":53},[44,2007,1025],{"class":50},[44,2009,2010],{"class":164}," add",[44,2012,168],{"class":53},[44,2014,1371],{"class":60},[44,2016,614],{"class":53},[44,2018,1376],{"class":60},[44,2020,2021],{"class":53},") ",[44,2023,1025],{"class":50},[44,2025,943],{"class":164},[44,2027,2028],{"class":53},"::endl;",[44,2030,2031],{"class":67}," // 输出 5\n",[10,2033,2034,2035],{},"核心语法 ",[24,2036,2037],{},"[捕获列表] (参数) -> 返回值 { 函数体 }",[1103,2039,2040,2046,2052,2058],{},[99,2041,2042,2045],{},[24,2043,2044],{},"[]"," 捕获列表：决定 lambda 如何拿外部变量",[99,2047,2048,2051],{},[24,2049,2050],{},"(参数)"," 参数列表，和普通函数一样",[99,2053,2054,2057],{},[24,2055,2056],{},"->"," 返回类型可省略（编译器推断）",[99,2059,2060,2063],{},[24,2061,2062],{},"{}"," 函数体",[1502,2065,2066,2073],{},[1505,2067,2068],{},[1508,2069,2070],{},[1511,2071,2072],{"align":1513},"Lambda 捕获规则一览（最常用的 90 % 都在这里）",[1519,2074,2075,2080,2086,2092,2099,2106,2113,2120,2127],{},[1508,2076,2077],{},[1524,2078,2079],{"align":1513},"语法",[1508,2081,2082],{},[1524,2083,2084],{"align":1513},[44,2085],{},[1508,2087,2088],{},[1524,2089,2090],{"align":1513},[44,2091,57],{},[1508,2093,2094],{},[1524,2095,2096],{"align":1513},[44,2097,2098],{},"&",[1508,2100,2101],{},[1524,2102,2103],{"align":1513},[44,2104,2105],{},"x",[1508,2107,2108],{},[1524,2109,2110],{"align":1513},[44,2111,2112],{},"&x",[1508,2114,2115],{},[1524,2116,2117],{"align":1513},[44,2118,2119],{},"x,&y",[1508,2121,2122],{},[1524,2123,2124],{"align":1513},[44,2125,2126],{},"this",[1508,2128,2129],{},[1524,2130,2131],{"align":1513},[44,2132,2133],{},"=, &foo",[812,2135,2136],{"id":2136},"基础用法",[10,2138,2139],{},"直接把num1与num2当参数传入，此时捕获列表不用任何东西：",[35,2141,2143],{"className":37,"code":2142,"language":39,"meta":40,"style":40},"#include \u003Ciostream>\n\nint main(int argc,char **argv)\n{\n    int num1 = 5;\n    int num2 = 6;\n\n    auto add = [](int a,int b)\n    {\n        return a + b;\n    };\n\n    std::cout \u003C\u003C add(num1,num2) \u003C\u003C std::endl;\n\n    std::cout \u003C\u003C \"Press Enter to continue...\";\n    std::cin.get(); // 等待用户按下回车键\n    return 0;\n}\n",[24,2144,2145,2151,2155,2177,2181,2194,2208,2212,2235,2240,2252,2257,2261,2280,2284,2296,2310,2318],{"__ignoreMap":40},[44,2146,2147,2149],{"class":46,"line":47},[44,2148,153],{"class":50},[44,2150,932],{"class":81},[44,2152,2153],{"class":46,"line":71},[44,2154,903],{"emptyLinePlaceholder":902},[44,2156,2157,2159,2161,2163,2165,2167,2169,2171,2173,2175],{"class":46,"line":192},[44,2158,161],{"class":50},[44,2160,165],{"class":164},[44,2162,168],{"class":53},[44,2164,161],{"class":50},[44,2166,174],{"class":173},[44,2168,177],{"class":53},[44,2170,180],{"class":50},[44,2172,183],{"class":50},[44,2174,186],{"class":173},[44,2176,189],{"class":53},[44,2178,2179],{"class":46,"line":198},[44,2180,195],{"class":53},[44,2182,2183,2185,2188,2190,2192],{"class":46,"line":218},[44,2184,1756],{"class":50},[44,2186,2187],{"class":53}," num1 ",[44,2189,57],{"class":50},[44,2191,1763],{"class":60},[44,2193,227],{"class":53},[44,2195,2196,2198,2201,2203,2206],{"class":46,"line":230},[44,2197,1756],{"class":50},[44,2199,2200],{"class":53}," num2 ",[44,2202,57],{"class":50},[44,2204,2205],{"class":60}," 6",[44,2207,227],{"class":53},[44,2209,2210],{"class":46,"line":474},[44,2211,903],{"emptyLinePlaceholder":902},[44,2213,2214,2217,2219,2221,2223,2225,2227,2229,2231,2233],{"class":46,"line":995},[44,2215,2216],{"class":50},"    auto",[44,2218,1955],{"class":53},[44,2220,57],{"class":50},[44,2222,1960],{"class":53},[44,2224,161],{"class":50},[44,2226,1965],{"class":173},[44,2228,177],{"class":53},[44,2230,161],{"class":50},[44,2232,1972],{"class":173},[44,2234,189],{"class":53},[44,2236,2237],{"class":46,"line":1000},[44,2238,2239],{"class":53},"    {\n",[44,2241,2242,2245,2247,2249],{"class":46,"line":1019},[44,2243,2244],{"class":50},"        return",[44,2246,430],{"class":53},[44,2248,1992],{"class":50},[44,2250,2251],{"class":53}," b;\n",[44,2253,2254],{"class":46,"line":1044},[44,2255,2256],{"class":53},"    };\n",[44,2258,2259],{"class":46,"line":1049},[44,2260,903],{"emptyLinePlaceholder":902},[44,2262,2263,2265,2267,2269,2271,2274,2276,2278],{"class":46,"line":1060},[44,2264,201],{"class":164},[44,2266,1475],{"class":53},[44,2268,1025],{"class":50},[44,2270,2010],{"class":164},[44,2272,2273],{"class":53},"(num1,num2) ",[44,2275,1025],{"class":50},[44,2277,943],{"class":164},[44,2279,1487],{"class":53},[44,2281,2282],{"class":46,"line":1065},[44,2283,903],{"emptyLinePlaceholder":902},[44,2285,2286,2288,2290,2292,2294],{"class":46,"line":1075},[44,2287,201],{"class":164},[44,2289,1475],{"class":53},[44,2291,1025],{"class":50},[44,2293,1893],{"class":81},[44,2295,227],{"class":53},[44,2297,2298,2300,2302,2304,2307],{"class":46,"line":1815},[44,2299,201],{"class":164},[44,2301,1903],{"class":53},[44,2303,1906],{"class":164},[44,2305,2306],{"class":53},"();",[44,2308,2309],{"class":67}," // 等待用户按下回车键\n",[44,2311,2312,2314,2316],{"class":46,"line":1820},[44,2313,221],{"class":50},[44,2315,224],{"class":60},[44,2317,227],{"class":53},[44,2319,2320],{"class":46,"line":1835},[44,2321,233],{"class":53},[10,2323,2324],{},[1194,2325],{"alt":40,"src":2326},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/10/05/image7.webp",[10,2328,2329],{},"使用捕获列表传入变量：",[35,2331,2333],{"className":37,"code":2332,"language":39,"meta":40,"style":40},"#include \u003Ciostream>\n\nint main(int argc,char **argv)\n{\n    int num1 = 5;\n    int num2 = 6;\n    int num3 = 1;\n\n    auto add = [num1,&num2](int c)\n    {\n        num2 = 3;\n        return num1 + num2 + c;\n    };\n\n    std::cout \u003C\u003C add(num3) \u003C\u003C std::endl;\n\n    std::cout \u003C\u003C \"Press Enter to continue...\";\n    std::cin.get(); // 等待用户按下回车键\n    return 0;\n}\n",[24,2334,2335,2341,2345,2367,2371,2383,2395,2409,2413,2444,2448,2459,2474,2478,2482,2501,2505,2517,2529,2537],{"__ignoreMap":40},[44,2336,2337,2339],{"class":46,"line":47},[44,2338,153],{"class":50},[44,2340,932],{"class":81},[44,2342,2343],{"class":46,"line":71},[44,2344,903],{"emptyLinePlaceholder":902},[44,2346,2347,2349,2351,2353,2355,2357,2359,2361,2363,2365],{"class":46,"line":192},[44,2348,161],{"class":50},[44,2350,165],{"class":164},[44,2352,168],{"class":53},[44,2354,161],{"class":50},[44,2356,174],{"class":173},[44,2358,177],{"class":53},[44,2360,180],{"class":50},[44,2362,183],{"class":50},[44,2364,186],{"class":173},[44,2366,189],{"class":53},[44,2368,2369],{"class":46,"line":198},[44,2370,195],{"class":53},[44,2372,2373,2375,2377,2379,2381],{"class":46,"line":218},[44,2374,1756],{"class":50},[44,2376,2187],{"class":53},[44,2378,57],{"class":50},[44,2380,1763],{"class":60},[44,2382,227],{"class":53},[44,2384,2385,2387,2389,2391,2393],{"class":46,"line":230},[44,2386,1756],{"class":50},[44,2388,2200],{"class":53},[44,2390,57],{"class":50},[44,2392,2205],{"class":60},[44,2394,227],{"class":53},[44,2396,2397,2399,2402,2404,2407],{"class":46,"line":474},[44,2398,1756],{"class":50},[44,2400,2401],{"class":53}," num3 ",[44,2403,57],{"class":50},[44,2405,2406],{"class":60}," 1",[44,2408,227],{"class":53},[44,2410,2411],{"class":46,"line":995},[44,2412,903],{"emptyLinePlaceholder":902},[44,2414,2415,2417,2419,2421,2424,2427,2429,2431,2434,2437,2439,2442],{"class":46,"line":1000},[44,2416,2216],{"class":50},[44,2418,1955],{"class":53},[44,2420,57],{"class":50},[44,2422,2423],{"class":53}," [",[44,2425,2426],{"class":173},"num1",[44,2428,177],{"class":53},[44,2430,2098],{"class":50},[44,2432,2433],{"class":173},"num2",[44,2435,2436],{"class":53},"](",[44,2438,161],{"class":50},[44,2440,2441],{"class":173}," c",[44,2443,189],{"class":53},[44,2445,2446],{"class":46,"line":1019},[44,2447,2239],{"class":53},[44,2449,2450,2453,2455,2457],{"class":46,"line":1044},[44,2451,2452],{"class":53},"        num2 ",[44,2454,57],{"class":50},[44,2456,1830],{"class":60},[44,2458,227],{"class":53},[44,2460,2461,2463,2465,2467,2469,2471],{"class":46,"line":1049},[44,2462,2244],{"class":50},[44,2464,2187],{"class":53},[44,2466,1992],{"class":50},[44,2468,2200],{"class":53},[44,2470,1992],{"class":50},[44,2472,2473],{"class":53}," c;\n",[44,2475,2476],{"class":46,"line":1060},[44,2477,2256],{"class":53},[44,2479,2480],{"class":46,"line":1065},[44,2481,903],{"emptyLinePlaceholder":902},[44,2483,2484,2486,2488,2490,2492,2495,2497,2499],{"class":46,"line":1075},[44,2485,201],{"class":164},[44,2487,1475],{"class":53},[44,2489,1025],{"class":50},[44,2491,2010],{"class":164},[44,2493,2494],{"class":53},"(num3) ",[44,2496,1025],{"class":50},[44,2498,943],{"class":164},[44,2500,1487],{"class":53},[44,2502,2503],{"class":46,"line":1815},[44,2504,903],{"emptyLinePlaceholder":902},[44,2506,2507,2509,2511,2513,2515],{"class":46,"line":1820},[44,2508,201],{"class":164},[44,2510,1475],{"class":53},[44,2512,1025],{"class":50},[44,2514,1893],{"class":81},[44,2516,227],{"class":53},[44,2518,2519,2521,2523,2525,2527],{"class":46,"line":1835},[44,2520,201],{"class":164},[44,2522,1903],{"class":53},[44,2524,1906],{"class":164},[44,2526,2306],{"class":53},[44,2528,2309],{"class":67},[44,2530,2531,2533,2535],{"class":46,"line":1855},[44,2532,221],{"class":50},[44,2534,224],{"class":60},[44,2536,227],{"class":53},[44,2538,2539],{"class":46,"line":1879},[44,2540,233],{"class":53},[10,2542,2543],{},"答案是9",[10,2545,2546],{},[1194,2547],{"alt":40,"src":2548},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/10/05/image8.webp",[10,2550,2551],{},"接下来是讲捕获this：",[10,2553,2554,2555,2558,2559,784],{},"在 ",[818,2556,2557],{},"类的成员函数中"," ，你可能希望 lambda 能访问或修改成员变量。这时，你要捕获当前对象的指针 ",[24,2560,2126],{},[35,2562,2564],{"className":37,"code":2563,"language":39,"meta":40,"style":40},"#include \u003Ciostream>\n\nclass MyClass \n{\n    public:\n        int num2 = 2;\n\n        void do_add() \n        {\n            int num1 = 10;\n            int num3 = 6;\n\n            // 在类的成员函数中访问自己的成员变量\n            auto add = [num1, this](int c) \n            {\n                num2 = 3;  // 访问 this->num2\n                return num1 + num2 + c;\n            };\n\n            std::cout \u003C\u003C add(num3) \u003C\u003C std::endl;\n        }\n};\n\nint main() {\n    MyClass obj;\n    obj.do_add();\n\n    std::cout \u003C\u003C \"Press Enter to continue...\";\n    std::cin.get();\n    return 0;\n}\n\n",[24,2565,2566,2572,2576,2587,2591,2596,2610,2614,2624,2629,2642,2654,2658,2663,2688,2693,2707,2722,2727,2731,2750,2755,2759,2763,2772,2778,2789,2794,2807,2818,2827],{"__ignoreMap":40},[44,2567,2568,2570],{"class":46,"line":47},[44,2569,153],{"class":50},[44,2571,932],{"class":81},[44,2573,2574],{"class":46,"line":71},[44,2575,903],{"emptyLinePlaceholder":902},[44,2577,2578,2581,2584],{"class":46,"line":192},[44,2579,2580],{"class":50},"class",[44,2582,2583],{"class":164}," MyClass",[44,2585,2586],{"class":53}," \n",[44,2588,2589],{"class":46,"line":198},[44,2590,195],{"class":53},[44,2592,2593],{"class":46,"line":218},[44,2594,2595],{"class":50},"    public:\n",[44,2597,2598,2601,2603,2605,2608],{"class":46,"line":230},[44,2599,2600],{"class":50},"        int",[44,2602,2200],{"class":53},[44,2604,57],{"class":50},[44,2606,2607],{"class":60}," 2",[44,2609,227],{"class":53},[44,2611,2612],{"class":46,"line":474},[44,2613,903],{"emptyLinePlaceholder":902},[44,2615,2616,2619,2622],{"class":46,"line":995},[44,2617,2618],{"class":50},"        void",[44,2620,2621],{"class":164}," do_add",[44,2623,1729],{"class":53},[44,2625,2626],{"class":46,"line":1000},[44,2627,2628],{"class":53},"        {\n",[44,2630,2631,2634,2636,2638,2640],{"class":46,"line":1019},[44,2632,2633],{"class":50},"            int",[44,2635,2187],{"class":53},[44,2637,57],{"class":50},[44,2639,435],{"class":60},[44,2641,227],{"class":53},[44,2643,2644,2646,2648,2650,2652],{"class":46,"line":1044},[44,2645,2633],{"class":50},[44,2647,2401],{"class":53},[44,2649,57],{"class":50},[44,2651,2205],{"class":60},[44,2653,227],{"class":53},[44,2655,2656],{"class":46,"line":1049},[44,2657,903],{"emptyLinePlaceholder":902},[44,2659,2660],{"class":46,"line":1060},[44,2661,2662],{"class":67},"            // 在类的成员函数中访问自己的成员变量\n",[44,2664,2665,2668,2670,2672,2674,2676,2678,2680,2682,2684,2686],{"class":46,"line":1065},[44,2666,2667],{"class":50},"            auto",[44,2669,1955],{"class":53},[44,2671,57],{"class":50},[44,2673,2423],{"class":53},[44,2675,2426],{"class":173},[44,2677,614],{"class":53},[44,2679,2126],{"class":60},[44,2681,2436],{"class":53},[44,2683,161],{"class":50},[44,2685,2441],{"class":173},[44,2687,1697],{"class":53},[44,2689,2690],{"class":46,"line":1075},[44,2691,2692],{"class":53},"            {\n",[44,2694,2695,2698,2700,2702,2704],{"class":46,"line":1815},[44,2696,2697],{"class":53},"                num2 ",[44,2699,57],{"class":50},[44,2701,1830],{"class":60},[44,2703,64],{"class":53},[44,2705,2706],{"class":67},"  // 访问 this->num2\n",[44,2708,2709,2712,2714,2716,2718,2720],{"class":46,"line":1820},[44,2710,2711],{"class":50},"                return",[44,2713,2187],{"class":53},[44,2715,1992],{"class":50},[44,2717,2200],{"class":53},[44,2719,1992],{"class":50},[44,2721,2473],{"class":53},[44,2723,2724],{"class":46,"line":1835},[44,2725,2726],{"class":53},"            };\n",[44,2728,2729],{"class":46,"line":1855},[44,2730,903],{"emptyLinePlaceholder":902},[44,2732,2733,2736,2738,2740,2742,2744,2746,2748],{"class":46,"line":1879},[44,2734,2735],{"class":164},"            std",[44,2737,1475],{"class":53},[44,2739,1025],{"class":50},[44,2741,2010],{"class":164},[44,2743,2494],{"class":53},[44,2745,1025],{"class":50},[44,2747,943],{"class":164},[44,2749,1487],{"class":53},[44,2751,2752],{"class":46,"line":1884},[44,2753,2754],{"class":53},"        }\n",[44,2756,2757],{"class":46,"line":1898},[44,2758,1379],{"class":53},[44,2760,2761],{"class":46,"line":1912},[44,2762,903],{"emptyLinePlaceholder":902},[44,2764,2765,2767,2769],{"class":46,"line":1921},[44,2766,161],{"class":50},[44,2768,165],{"class":164},[44,2770,2771],{"class":53},"() {\n",[44,2773,2775],{"class":46,"line":2774},25,[44,2776,2777],{"class":53},"    MyClass obj;\n",[44,2779,2781,2784,2787],{"class":46,"line":2780},26,[44,2782,2783],{"class":53},"    obj.",[44,2785,2786],{"class":164},"do_add",[44,2788,1909],{"class":53},[44,2790,2792],{"class":46,"line":2791},27,[44,2793,903],{"emptyLinePlaceholder":902},[44,2795,2797,2799,2801,2803,2805],{"class":46,"line":2796},28,[44,2798,201],{"class":164},[44,2800,1475],{"class":53},[44,2802,1025],{"class":50},[44,2804,1893],{"class":81},[44,2806,227],{"class":53},[44,2808,2810,2812,2814,2816],{"class":46,"line":2809},29,[44,2811,201],{"class":164},[44,2813,1903],{"class":53},[44,2815,1906],{"class":164},[44,2817,1909],{"class":53},[44,2819,2821,2823,2825],{"class":46,"line":2820},30,[44,2822,221],{"class":50},[44,2824,224],{"class":60},[44,2826,227],{"class":53},[44,2828,2830],{"class":46,"line":2829},31,[44,2831,233],{"class":53},[812,2833,2834],{"id":2834},"高级用法",[1502,2836,2837,2850],{},[1505,2838,2839],{},[1508,2840,2841,2844,2846,2848],{},[1511,2842,2843],{"align":1513},"特性",[1511,2845,1526],{"align":1513},[1511,2847,1534],{"align":1513},[1511,2849,1542],{"align":1513},[1519,2851,2852,2865,2877,2889,2901,2912],{},[1508,2853,2854,2857,2860,2862],{},[1524,2855,2856],{"align":1513},"捕获变量",[1524,2858,2859],{"align":1513},"✅",[1524,2861,2859],{"align":1513},[1524,2863,2864],{"align":1513},"✅（支持组合、更灵活）",[1508,2866,2867,2870,2872,2875],{},[1524,2868,2869],{"align":1513},"mutable",[1524,2871,2859],{"align":1513},[1524,2873,2874],{"align":1513},"✅（配合 auto 更实用）",[1524,2876,2859],{"align":1513},[1508,2878,2879,2882,2885,2887],{},[1524,2880,2881],{"align":1513},"泛型参数 auto",[1524,2883,2884],{"align":1513},"❌",[1524,2886,2859],{"align":1513},[1524,2888,2859],{"align":1513},[1508,2890,2891,2894,2896,2898],{},[1524,2892,2893],{"align":1513},"捕获 *this",[1524,2895,2884],{"align":1513},[1524,2897,2884],{"align":1513},[1524,2899,2900],{"align":1513},"✅（值拷贝 this）",[1508,2902,2903,2906,2908,2910],{},[1524,2904,2905],{"align":1513},"constexpr λ",[1524,2907,2884],{"align":1513},[1524,2909,2884],{"align":1513},[1524,2911,2859],{"align":1513},[1508,2913,2914,2917,2920,2923],{},[1524,2915,2916],{"align":1513},"嵌套递归 lambda",[1524,2918,2919],{"align":1513},"复杂",[1524,2921,2922],{"align":1513},"稍好（配合 std::function）",[1524,2924,2925],{"align":1513},"更方便",[96,2927,2928],{},[99,2929,2869],{},[10,2931,2932],{},"如果我就想修改按值捕获的变量怎么办？",[10,2934,2935],{},"C++11提供了mutable，可以让你在Lambda里直接修改按值捕获的变量。",[35,2937,2939],{"className":37,"code":2938,"language":39,"meta":40,"style":40},"#include \u003Ciostream>\n\nint main(int argc,char **argv)\n{\n    int num1 = 5;\n    int num2 = 6;\n    int num3 = 1;\n\n    auto add = [num1,&num2](int c)mutable\n    {\n        num1 = 6;\n        num2 = 3;\n        return num1 + num2 + c;\n    };\n\n    std::cout \u003C\u003C add(num3) \u003C\u003C std::endl;\n\n    std::cout \u003C\u003C \"Press Enter to continue...\";\n    std::cin.get(); // 等待用户按下回车键\n    return 0;\n}\n",[24,2940,2941,2947,2951,2973,2977,2989,3001,3013,3017,3047,3051,3062,3072,3086,3090,3094,3112,3116,3128,3140,3148],{"__ignoreMap":40},[44,2942,2943,2945],{"class":46,"line":47},[44,2944,153],{"class":50},[44,2946,932],{"class":81},[44,2948,2949],{"class":46,"line":71},[44,2950,903],{"emptyLinePlaceholder":902},[44,2952,2953,2955,2957,2959,2961,2963,2965,2967,2969,2971],{"class":46,"line":192},[44,2954,161],{"class":50},[44,2956,165],{"class":164},[44,2958,168],{"class":53},[44,2960,161],{"class":50},[44,2962,174],{"class":173},[44,2964,177],{"class":53},[44,2966,180],{"class":50},[44,2968,183],{"class":50},[44,2970,186],{"class":173},[44,2972,189],{"class":53},[44,2974,2975],{"class":46,"line":198},[44,2976,195],{"class":53},[44,2978,2979,2981,2983,2985,2987],{"class":46,"line":218},[44,2980,1756],{"class":50},[44,2982,2187],{"class":53},[44,2984,57],{"class":50},[44,2986,1763],{"class":60},[44,2988,227],{"class":53},[44,2990,2991,2993,2995,2997,2999],{"class":46,"line":230},[44,2992,1756],{"class":50},[44,2994,2200],{"class":53},[44,2996,57],{"class":50},[44,2998,2205],{"class":60},[44,3000,227],{"class":53},[44,3002,3003,3005,3007,3009,3011],{"class":46,"line":474},[44,3004,1756],{"class":50},[44,3006,2401],{"class":53},[44,3008,57],{"class":50},[44,3010,2406],{"class":60},[44,3012,227],{"class":53},[44,3014,3015],{"class":46,"line":995},[44,3016,903],{"emptyLinePlaceholder":902},[44,3018,3019,3021,3023,3025,3027,3029,3031,3033,3035,3037,3039,3041,3044],{"class":46,"line":1000},[44,3020,2216],{"class":50},[44,3022,1955],{"class":53},[44,3024,57],{"class":50},[44,3026,2423],{"class":53},[44,3028,2426],{"class":173},[44,3030,177],{"class":53},[44,3032,2098],{"class":50},[44,3034,2433],{"class":173},[44,3036,2436],{"class":53},[44,3038,161],{"class":50},[44,3040,2441],{"class":173},[44,3042,3043],{"class":53},")",[44,3045,3046],{"class":50},"mutable\n",[44,3048,3049],{"class":46,"line":1019},[44,3050,2239],{"class":53},[44,3052,3053,3056,3058,3060],{"class":46,"line":1044},[44,3054,3055],{"class":53},"        num1 ",[44,3057,57],{"class":50},[44,3059,2205],{"class":60},[44,3061,227],{"class":53},[44,3063,3064,3066,3068,3070],{"class":46,"line":1049},[44,3065,2452],{"class":53},[44,3067,57],{"class":50},[44,3069,1830],{"class":60},[44,3071,227],{"class":53},[44,3073,3074,3076,3078,3080,3082,3084],{"class":46,"line":1060},[44,3075,2244],{"class":50},[44,3077,2187],{"class":53},[44,3079,1992],{"class":50},[44,3081,2200],{"class":53},[44,3083,1992],{"class":50},[44,3085,2473],{"class":53},[44,3087,3088],{"class":46,"line":1065},[44,3089,2256],{"class":53},[44,3091,3092],{"class":46,"line":1075},[44,3093,903],{"emptyLinePlaceholder":902},[44,3095,3096,3098,3100,3102,3104,3106,3108,3110],{"class":46,"line":1815},[44,3097,201],{"class":164},[44,3099,1475],{"class":53},[44,3101,1025],{"class":50},[44,3103,2010],{"class":164},[44,3105,2494],{"class":53},[44,3107,1025],{"class":50},[44,3109,943],{"class":164},[44,3111,1487],{"class":53},[44,3113,3114],{"class":46,"line":1820},[44,3115,903],{"emptyLinePlaceholder":902},[44,3117,3118,3120,3122,3124,3126],{"class":46,"line":1835},[44,3119,201],{"class":164},[44,3121,1475],{"class":53},[44,3123,1025],{"class":50},[44,3125,1893],{"class":81},[44,3127,227],{"class":53},[44,3129,3130,3132,3134,3136,3138],{"class":46,"line":1855},[44,3131,201],{"class":164},[44,3133,1903],{"class":53},[44,3135,1906],{"class":164},[44,3137,2306],{"class":53},[44,3139,2309],{"class":67},[44,3141,3142,3144,3146],{"class":46,"line":1879},[44,3143,221],{"class":50},[44,3145,224],{"class":60},[44,3147,227],{"class":53},[44,3149,3150],{"class":46,"line":1884},[44,3151,233],{"class":53},[10,3153,3154],{},"答案是10",[10,3156,3157],{},[1194,3158],{"alt":40,"src":3159},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/10/05/image9.webp",[96,3161,3162],{"start":71},[99,3163,3164],{},"泛型 lambda 参数",[10,3166,3167],{},"C++14提供了泛型 lambda 参数，不再需要模板函数了，lambda 直接支持“模板参数”！",[35,3169,3171],{"className":37,"code":3170,"language":39,"meta":40,"style":40},"#include \u003Ciostream>\n\nint main(int argc,char **argv)\n{\n\n    auto add = [](auto a,auto b)\n    {\n        return a + b;\n    };\n\n    std::cout \u003C\u003C add(1,7) \u003C\u003C std::endl;\n    std::cout \u003C\u003C add(1.1,1.7) \u003C\u003C std::endl;\n    std::cout \u003C\u003C add(std::string(\"hi \"), std::string(\"vinci\")) \u003C\u003C std::endl;\n\n    std::cout \u003C\u003C \"Press Enter to continue...\";\n    std::cin.get(); // 等待用户按下回车键\n    return 0;\n}\n",[24,3172,3173,3179,3183,3205,3209,3213,3235,3239,3249,3253,3257,3284,3312,3359,3363,3375,3387,3395],{"__ignoreMap":40},[44,3174,3175,3177],{"class":46,"line":47},[44,3176,153],{"class":50},[44,3178,932],{"class":81},[44,3180,3181],{"class":46,"line":71},[44,3182,903],{"emptyLinePlaceholder":902},[44,3184,3185,3187,3189,3191,3193,3195,3197,3199,3201,3203],{"class":46,"line":192},[44,3186,161],{"class":50},[44,3188,165],{"class":164},[44,3190,168],{"class":53},[44,3192,161],{"class":50},[44,3194,174],{"class":173},[44,3196,177],{"class":53},[44,3198,180],{"class":50},[44,3200,183],{"class":50},[44,3202,186],{"class":173},[44,3204,189],{"class":53},[44,3206,3207],{"class":46,"line":198},[44,3208,195],{"class":53},[44,3210,3211],{"class":46,"line":218},[44,3212,903],{"emptyLinePlaceholder":902},[44,3214,3215,3217,3219,3221,3223,3225,3227,3229,3231,3233],{"class":46,"line":230},[44,3216,2216],{"class":50},[44,3218,1955],{"class":53},[44,3220,57],{"class":50},[44,3222,1960],{"class":53},[44,3224,26],{"class":50},[44,3226,1965],{"class":173},[44,3228,177],{"class":53},[44,3230,26],{"class":50},[44,3232,1972],{"class":173},[44,3234,189],{"class":53},[44,3236,3237],{"class":46,"line":474},[44,3238,2239],{"class":53},[44,3240,3241,3243,3245,3247],{"class":46,"line":995},[44,3242,2244],{"class":50},[44,3244,430],{"class":53},[44,3246,1992],{"class":50},[44,3248,2251],{"class":53},[44,3250,3251],{"class":46,"line":1000},[44,3252,2256],{"class":53},[44,3254,3255],{"class":46,"line":1019},[44,3256,903],{"emptyLinePlaceholder":902},[44,3258,3259,3261,3263,3265,3267,3269,3271,3273,3276,3278,3280,3282],{"class":46,"line":1044},[44,3260,201],{"class":164},[44,3262,1475],{"class":53},[44,3264,1025],{"class":50},[44,3266,2010],{"class":164},[44,3268,168],{"class":53},[44,3270,1366],{"class":60},[44,3272,177],{"class":53},[44,3274,3275],{"class":60},"7",[44,3277,2021],{"class":53},[44,3279,1025],{"class":50},[44,3281,943],{"class":164},[44,3283,1487],{"class":53},[44,3285,3286,3288,3290,3292,3294,3296,3299,3301,3304,3306,3308,3310],{"class":46,"line":1049},[44,3287,201],{"class":164},[44,3289,1475],{"class":53},[44,3291,1025],{"class":50},[44,3293,2010],{"class":164},[44,3295,168],{"class":53},[44,3297,3298],{"class":60},"1.1",[44,3300,177],{"class":53},[44,3302,3303],{"class":60},"1.7",[44,3305,2021],{"class":53},[44,3307,1025],{"class":50},[44,3309,943],{"class":164},[44,3311,1487],{"class":53},[44,3313,3314,3316,3318,3320,3322,3324,3326,3328,3331,3333,3336,3339,3341,3343,3345,3347,3350,3353,3355,3357],{"class":46,"line":1060},[44,3315,201],{"class":164},[44,3317,1475],{"class":53},[44,3319,1025],{"class":50},[44,3321,2010],{"class":164},[44,3323,168],{"class":53},[44,3325,292],{"class":164},[44,3327,204],{"class":53},[44,3329,3330],{"class":164},"string",[44,3332,168],{"class":53},[44,3334,3335],{"class":81},"\"hi \"",[44,3337,3338],{"class":53},"), ",[44,3340,292],{"class":164},[44,3342,204],{"class":53},[44,3344,3330],{"class":164},[44,3346,168],{"class":53},[44,3348,3349],{"class":81},"\"vinci\"",[44,3351,3352],{"class":53},")) ",[44,3354,1025],{"class":50},[44,3356,943],{"class":164},[44,3358,1487],{"class":53},[44,3360,3361],{"class":46,"line":1065},[44,3362,903],{"emptyLinePlaceholder":902},[44,3364,3365,3367,3369,3371,3373],{"class":46,"line":1075},[44,3366,201],{"class":164},[44,3368,1475],{"class":53},[44,3370,1025],{"class":50},[44,3372,1893],{"class":81},[44,3374,227],{"class":53},[44,3376,3377,3379,3381,3383,3385],{"class":46,"line":1815},[44,3378,201],{"class":164},[44,3380,1903],{"class":53},[44,3382,1906],{"class":164},[44,3384,2306],{"class":53},[44,3386,2309],{"class":67},[44,3388,3389,3391,3393],{"class":46,"line":1820},[44,3390,221],{"class":50},[44,3392,224],{"class":60},[44,3394,227],{"class":53},[44,3396,3397],{"class":46,"line":1835},[44,3398,233],{"class":53},[10,3400,3401],{},[1194,3402],{"alt":40,"src":3403},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/10/05/image10.webp",[96,3405,3406],{"start":192},[99,3407,3408],{},"捕获*this",[1502,3410,3411,3427],{},[1505,3412,3413],{},[1508,3414,3415,3418,3421,3424],{},[1511,3416,3417],{"align":1513},"捕获方式",[1511,3419,3420],{"align":1513},"意思",[1511,3422,3423],{"align":1513},"会捕获什么",[1511,3425,3426],{"align":1513},"生命周期影响",[1519,3428,3429,3444],{},[1508,3430,3431,3435,3438,3441],{},[1524,3432,3433],{"align":1513},[44,3434,2126],{},[1524,3436,3437],{"align":1513},"捕获当前对象的指针",[1524,3439,3440],{"align":1513},"指针 this",[1524,3442,3443],{"align":1513},"外部对象必须活着，否则悬空",[1508,3445,3446,3451,3454,3457],{},[1524,3447,3448],{"align":1513},[44,3449,3450],{},"*this",[1524,3452,3453],{"align":1513},"捕获当前对象的副本",[1524,3455,3456],{"align":1513},"整个对象（值拷贝）",[1524,3458,3459],{"align":1513},"安全，跟 lambda 活得一样久",[10,3461,3462,3463,3465],{},"如果只是[this]，",[24,3464,2126],{}," 是一个指针，指向当前对象，这个 lambda 只是记住了这个地址（指针），如果这个 lambda 比对象生命周期长，就悬挂指针❌。",[10,3467,3468],{},"如果是[*this]，直接把整个对象拷贝进 lambda，不依赖外部对象是否还活着，lambda比对象活得久也没关系这个 lambda 可以安全延迟执行、在线程中运行等。",[10,3470,3471,3474],{},[24,3472,3473],{},"[this]"," 就像是说：“我知道对象在哪，我只存地址” 🧷",[10,3476,3477,3480],{},[24,3478,3479],{},"[*this]"," 是：“我整个对象拷一份，我自己留着用” 📦",[35,3482,3484],{"className":37,"code":3483,"language":39,"meta":40,"style":40},"#include \u003Ciostream>\n\nclass A {\npublic:\n    int x = 100;\n\n    auto get_this_lambda() \n    {\n        return [this]() { std::cout \u003C\u003C \"this: \" \u003C\u003C x \u003C\u003C \"\\n\"; };\n    }\n\n    auto get_star_this_lambda() \n    {\n        return [*this]() { std::cout \u003C\u003C \"*this: \" \u003C\u003C x \u003C\u003C \"\\n\"; };\n    }\n};\n\nint main() \n{\n    A a;\n    auto lam1 = a.get_this_lambda();\n    auto lam2 = a.get_star_this_lambda();\n\n    lam1();  // 输出 100\n    lam2();  // 输出 100\n\n    a.x = 200;\n\n    lam1();  // 输出 200 （引用原对象）\n    lam2();  // 还是 100 （因为是副本）\n\n    std::cout \u003C\u003C \"Press Enter to continue...\";\n    std::cin.get();\n    return 0;\n}\n\n",[24,3485,3486,3492,3496,3505,3510,3523,3527,3536,3540,3578,3583,3587,3596,3600,3635,3639,3643,3647,3655,3659,3664,3681,3697,3701,3711,3720,3724,3736,3740,3749,3758,3762,3775,3786,3795],{"__ignoreMap":40},[44,3487,3488,3490],{"class":46,"line":47},[44,3489,153],{"class":50},[44,3491,932],{"class":81},[44,3493,3494],{"class":46,"line":71},[44,3495,903],{"emptyLinePlaceholder":902},[44,3497,3498,3500,3503],{"class":46,"line":192},[44,3499,2580],{"class":50},[44,3501,3502],{"class":164}," A",[44,3504,277],{"class":53},[44,3506,3507],{"class":46,"line":198},[44,3508,3509],{"class":50},"public:\n",[44,3511,3512,3514,3516,3518,3521],{"class":46,"line":218},[44,3513,1756],{"class":50},[44,3515,54],{"class":53},[44,3517,57],{"class":50},[44,3519,3520],{"class":60}," 100",[44,3522,227],{"class":53},[44,3524,3525],{"class":46,"line":230},[44,3526,903],{"emptyLinePlaceholder":902},[44,3528,3529,3531,3534],{"class":46,"line":474},[44,3530,2216],{"class":50},[44,3532,3533],{"class":164}," get_this_lambda",[44,3535,1729],{"class":53},[44,3537,3538],{"class":46,"line":995},[44,3539,2239],{"class":53},[44,3541,3542,3544,3546,3548,3551,3553,3555,3557,3560,3562,3564,3566,3569,3572,3575],{"class":46,"line":1000},[44,3543,2244],{"class":50},[44,3545,2423],{"class":53},[44,3547,2126],{"class":60},[44,3549,3550],{"class":53},"]() { ",[44,3552,292],{"class":164},[44,3554,1475],{"class":53},[44,3556,1025],{"class":50},[44,3558,3559],{"class":81}," \"this: \"",[44,3561,1031],{"class":50},[44,3563,54],{"class":53},[44,3565,1025],{"class":50},[44,3567,3568],{"class":81}," \"",[44,3570,3571],{"class":60},"\\n",[44,3573,3574],{"class":81},"\"",[44,3576,3577],{"class":53},"; };\n",[44,3579,3580],{"class":46,"line":1019},[44,3581,3582],{"class":53},"    }\n",[44,3584,3585],{"class":46,"line":1044},[44,3586,903],{"emptyLinePlaceholder":902},[44,3588,3589,3591,3594],{"class":46,"line":1049},[44,3590,2216],{"class":50},[44,3592,3593],{"class":164}," get_star_this_lambda",[44,3595,1729],{"class":53},[44,3597,3598],{"class":46,"line":1060},[44,3599,2239],{"class":53},[44,3601,3602,3604,3606,3608,3610,3612,3614,3616,3618,3621,3623,3625,3627,3629,3631,3633],{"class":46,"line":1065},[44,3603,2244],{"class":50},[44,3605,2423],{"class":53},[44,3607,1316],{"class":50},[44,3609,2126],{"class":60},[44,3611,3550],{"class":53},[44,3613,292],{"class":164},[44,3615,1475],{"class":53},[44,3617,1025],{"class":50},[44,3619,3620],{"class":81}," \"*this: \"",[44,3622,1031],{"class":50},[44,3624,54],{"class":53},[44,3626,1025],{"class":50},[44,3628,3568],{"class":81},[44,3630,3571],{"class":60},[44,3632,3574],{"class":81},[44,3634,3577],{"class":53},[44,3636,3637],{"class":46,"line":1075},[44,3638,3582],{"class":53},[44,3640,3641],{"class":46,"line":1815},[44,3642,1379],{"class":53},[44,3644,3645],{"class":46,"line":1820},[44,3646,903],{"emptyLinePlaceholder":902},[44,3648,3649,3651,3653],{"class":46,"line":1835},[44,3650,161],{"class":50},[44,3652,165],{"class":164},[44,3654,1729],{"class":53},[44,3656,3657],{"class":46,"line":1855},[44,3658,195],{"class":53},[44,3660,3661],{"class":46,"line":1879},[44,3662,3663],{"class":53},"    A a;\n",[44,3665,3666,3668,3671,3673,3676,3679],{"class":46,"line":1884},[44,3667,2216],{"class":50},[44,3669,3670],{"class":53}," lam1 ",[44,3672,57],{"class":50},[44,3674,3675],{"class":53}," a.",[44,3677,3678],{"class":164},"get_this_lambda",[44,3680,1909],{"class":53},[44,3682,3683,3685,3688,3690,3692,3695],{"class":46,"line":1898},[44,3684,2216],{"class":50},[44,3686,3687],{"class":53}," lam2 ",[44,3689,57],{"class":50},[44,3691,3675],{"class":53},[44,3693,3694],{"class":164},"get_star_this_lambda",[44,3696,1909],{"class":53},[44,3698,3699],{"class":46,"line":1912},[44,3700,903],{"emptyLinePlaceholder":902},[44,3702,3703,3706,3708],{"class":46,"line":1921},[44,3704,3705],{"class":164},"    lam1",[44,3707,2306],{"class":53},[44,3709,3710],{"class":67},"  // 输出 100\n",[44,3712,3713,3716,3718],{"class":46,"line":2774},[44,3714,3715],{"class":164},"    lam2",[44,3717,2306],{"class":53},[44,3719,3710],{"class":67},[44,3721,3722],{"class":46,"line":2780},[44,3723,903],{"emptyLinePlaceholder":902},[44,3725,3726,3729,3731,3734],{"class":46,"line":2791},[44,3727,3728],{"class":53},"    a.x ",[44,3730,57],{"class":50},[44,3732,3733],{"class":60}," 200",[44,3735,227],{"class":53},[44,3737,3738],{"class":46,"line":2796},[44,3739,903],{"emptyLinePlaceholder":902},[44,3741,3742,3744,3746],{"class":46,"line":2809},[44,3743,3705],{"class":164},[44,3745,2306],{"class":53},[44,3747,3748],{"class":67},"  // 输出 200 （引用原对象）\n",[44,3750,3751,3753,3755],{"class":46,"line":2820},[44,3752,3715],{"class":164},[44,3754,2306],{"class":53},[44,3756,3757],{"class":67},"  // 还是 100 （因为是副本）\n",[44,3759,3760],{"class":46,"line":2829},[44,3761,903],{"emptyLinePlaceholder":902},[44,3763,3765,3767,3769,3771,3773],{"class":46,"line":3764},32,[44,3766,201],{"class":164},[44,3768,1475],{"class":53},[44,3770,1025],{"class":50},[44,3772,1893],{"class":81},[44,3774,227],{"class":53},[44,3776,3778,3780,3782,3784],{"class":46,"line":3777},33,[44,3779,201],{"class":164},[44,3781,1903],{"class":53},[44,3783,1906],{"class":164},[44,3785,1909],{"class":53},[44,3787,3789,3791,3793],{"class":46,"line":3788},34,[44,3790,221],{"class":50},[44,3792,224],{"class":60},[44,3794,227],{"class":53},[44,3796,3798],{"class":46,"line":3797},35,[44,3799,233],{"class":53},[10,3801,3802],{},"我如果想使用*this,还想修改副本里的数值怎么办呢？那么就得加一个mutable了。",[35,3804,3806],{"className":37,"code":3805,"language":39,"meta":40,"style":40},"#include \u003Ciostream>\n\nclass MyClass \n{\n    public:\n        int num2 = 2;\n\n        auto get_add_lambda() \n        {\n            int num1 = 10;\n\n            // 在类的成员函数中访问自己的成员变量\n            return [num1, *this](int c)mutable\n            {\n                num2 = 3;  //用mutable才能修改副本的成员变量num2\n                return num1 + num2 + c;\n            };\n        }\n};\n\nint main() \n{\n    // 用 new 动态创建 obj\n    MyClass* obj = new MyClass();\n\n    // 从堆上的 obj 获取 lambda\n    auto add_func = obj->get_add_lambda();\n\n    // 手动释放 obj（原对象没了）\n    delete obj;\n\n    // lambda 里访问的是副本，安全\n    std::cout \u003C\u003C add_func(6) \u003C\u003C std::endl;  // 输出 10 + 3 + 6 = 19\n\n    std::cout \u003C\u003C \"Press Enter to continue...\";\n    std::cin.get();\n    return 0;\n}\n\n",[24,3807,3808,3814,3818,3826,3830,3834,3846,3850,3860,3864,3876,3880,3884,3909,3913,3926,3940,3944,3948,3952,3956,3964,3968,3973,3991,3995,4000,4017,4021,4026,4034,4038,4043,4070,4074,4086,4097,4106],{"__ignoreMap":40},[44,3809,3810,3812],{"class":46,"line":47},[44,3811,153],{"class":50},[44,3813,932],{"class":81},[44,3815,3816],{"class":46,"line":71},[44,3817,903],{"emptyLinePlaceholder":902},[44,3819,3820,3822,3824],{"class":46,"line":192},[44,3821,2580],{"class":50},[44,3823,2583],{"class":164},[44,3825,2586],{"class":53},[44,3827,3828],{"class":46,"line":198},[44,3829,195],{"class":53},[44,3831,3832],{"class":46,"line":218},[44,3833,2595],{"class":50},[44,3835,3836,3838,3840,3842,3844],{"class":46,"line":230},[44,3837,2600],{"class":50},[44,3839,2200],{"class":53},[44,3841,57],{"class":50},[44,3843,2607],{"class":60},[44,3845,227],{"class":53},[44,3847,3848],{"class":46,"line":474},[44,3849,903],{"emptyLinePlaceholder":902},[44,3851,3852,3855,3858],{"class":46,"line":995},[44,3853,3854],{"class":50},"        auto",[44,3856,3857],{"class":164}," get_add_lambda",[44,3859,1729],{"class":53},[44,3861,3862],{"class":46,"line":1000},[44,3863,2628],{"class":53},[44,3865,3866,3868,3870,3872,3874],{"class":46,"line":1019},[44,3867,2633],{"class":50},[44,3869,2187],{"class":53},[44,3871,57],{"class":50},[44,3873,435],{"class":60},[44,3875,227],{"class":53},[44,3877,3878],{"class":46,"line":1044},[44,3879,903],{"emptyLinePlaceholder":902},[44,3881,3882],{"class":46,"line":1049},[44,3883,2662],{"class":67},[44,3885,3886,3889,3891,3893,3895,3897,3899,3901,3903,3905,3907],{"class":46,"line":1060},[44,3887,3888],{"class":50},"            return",[44,3890,2423],{"class":53},[44,3892,2426],{"class":173},[44,3894,614],{"class":53},[44,3896,1316],{"class":50},[44,3898,2126],{"class":60},[44,3900,2436],{"class":53},[44,3902,161],{"class":50},[44,3904,2441],{"class":173},[44,3906,3043],{"class":53},[44,3908,3046],{"class":50},[44,3910,3911],{"class":46,"line":1065},[44,3912,2692],{"class":53},[44,3914,3915,3917,3919,3921,3923],{"class":46,"line":1075},[44,3916,2697],{"class":53},[44,3918,57],{"class":50},[44,3920,1830],{"class":60},[44,3922,64],{"class":53},[44,3924,3925],{"class":67},"  //用mutable才能修改副本的成员变量num2\n",[44,3927,3928,3930,3932,3934,3936,3938],{"class":46,"line":1815},[44,3929,2711],{"class":50},[44,3931,2187],{"class":53},[44,3933,1992],{"class":50},[44,3935,2200],{"class":53},[44,3937,1992],{"class":50},[44,3939,2473],{"class":53},[44,3941,3942],{"class":46,"line":1820},[44,3943,2726],{"class":53},[44,3945,3946],{"class":46,"line":1835},[44,3947,2754],{"class":53},[44,3949,3950],{"class":46,"line":1855},[44,3951,1379],{"class":53},[44,3953,3954],{"class":46,"line":1879},[44,3955,903],{"emptyLinePlaceholder":902},[44,3957,3958,3960,3962],{"class":46,"line":1884},[44,3959,161],{"class":50},[44,3961,165],{"class":164},[44,3963,1729],{"class":53},[44,3965,3966],{"class":46,"line":1898},[44,3967,195],{"class":53},[44,3969,3970],{"class":46,"line":1912},[44,3971,3972],{"class":67},"    // 用 new 动态创建 obj\n",[44,3974,3975,3978,3980,3983,3985,3987,3989],{"class":46,"line":1921},[44,3976,3977],{"class":53},"    MyClass",[44,3979,1316],{"class":50},[44,3981,3982],{"class":53}," obj ",[44,3984,57],{"class":50},[44,3986,889],{"class":50},[44,3988,2583],{"class":164},[44,3990,1909],{"class":53},[44,3992,3993],{"class":46,"line":2774},[44,3994,903],{"emptyLinePlaceholder":902},[44,3996,3997],{"class":46,"line":2780},[44,3998,3999],{"class":67},"    // 从堆上的 obj 获取 lambda\n",[44,4001,4002,4004,4007,4009,4012,4015],{"class":46,"line":2791},[44,4003,2216],{"class":50},[44,4005,4006],{"class":53}," add_func ",[44,4008,57],{"class":50},[44,4010,4011],{"class":53}," obj->",[44,4013,4014],{"class":164},"get_add_lambda",[44,4016,1909],{"class":53},[44,4018,4019],{"class":46,"line":2796},[44,4020,903],{"emptyLinePlaceholder":902},[44,4022,4023],{"class":46,"line":2809},[44,4024,4025],{"class":67},"    // 手动释放 obj（原对象没了）\n",[44,4027,4028,4031],{"class":46,"line":2820},[44,4029,4030],{"class":50},"    delete",[44,4032,4033],{"class":53}," obj;\n",[44,4035,4036],{"class":46,"line":2829},[44,4037,903],{"emptyLinePlaceholder":902},[44,4039,4040],{"class":46,"line":3764},[44,4041,4042],{"class":67},"    // lambda 里访问的是副本，安全\n",[44,4044,4045,4047,4049,4051,4054,4056,4059,4061,4063,4065,4067],{"class":46,"line":3777},[44,4046,201],{"class":164},[44,4048,1475],{"class":53},[44,4050,1025],{"class":50},[44,4052,4053],{"class":164}," add_func",[44,4055,168],{"class":53},[44,4057,4058],{"class":60},"6",[44,4060,2021],{"class":53},[44,4062,1025],{"class":50},[44,4064,943],{"class":164},[44,4066,2028],{"class":53},[44,4068,4069],{"class":67},"  // 输出 10 + 3 + 6 = 19\n",[44,4071,4072],{"class":46,"line":3788},[44,4073,903],{"emptyLinePlaceholder":902},[44,4075,4076,4078,4080,4082,4084],{"class":46,"line":3797},[44,4077,201],{"class":164},[44,4079,1475],{"class":53},[44,4081,1025],{"class":50},[44,4083,1893],{"class":81},[44,4085,227],{"class":53},[44,4087,4089,4091,4093,4095],{"class":46,"line":4088},36,[44,4090,201],{"class":164},[44,4092,1903],{"class":53},[44,4094,1906],{"class":164},[44,4096,1909],{"class":53},[44,4098,4100,4102,4104],{"class":46,"line":4099},37,[44,4101,221],{"class":50},[44,4103,224],{"class":60},[44,4105,227],{"class":53},[44,4107,4109],{"class":46,"line":4108},38,[44,4110,233],{"class":53},[96,4112,4113],{"start":198},[99,4114,4115],{},"constexpr编译期lambda",[35,4117,4119],{"className":37,"code":4118,"language":39,"meta":40,"style":40},"#include \u003Ciostream>\n\nint main() \n{\n    // C++17 constexpr lambda，捕获为空\n    constexpr auto square = [](int x) constexpr \n    {\n        return x * x;\n    };\n\n    constexpr int val = square(5);  // 编译期计算\n    std::cout \u003C\u003C val \u003C\u003C std::endl; // 输出 25\n\n    std::cout \u003C\u003C \"Press Enter to continue...\";\n    std::cin.get();\n    return 0;\n}\n\n",[24,4120,4121,4127,4131,4139,4143,4148,4173,4177,4188,4192,4196,4217,4236,4240,4252,4262,4270],{"__ignoreMap":40},[44,4122,4123,4125],{"class":46,"line":47},[44,4124,153],{"class":50},[44,4126,932],{"class":81},[44,4128,4129],{"class":46,"line":71},[44,4130,903],{"emptyLinePlaceholder":902},[44,4132,4133,4135,4137],{"class":46,"line":192},[44,4134,161],{"class":50},[44,4136,165],{"class":164},[44,4138,1729],{"class":53},[44,4140,4141],{"class":46,"line":198},[44,4142,195],{"class":53},[44,4144,4145],{"class":46,"line":218},[44,4146,4147],{"class":67},"    // C++17 constexpr lambda，捕获为空\n",[44,4149,4150,4152,4155,4158,4160,4162,4164,4167,4169,4171],{"class":46,"line":230},[44,4151,1790],{"class":50},[44,4153,4154],{"class":50}," auto",[44,4156,4157],{"class":53}," square ",[44,4159,57],{"class":50},[44,4161,1960],{"class":53},[44,4163,161],{"class":50},[44,4165,4166],{"class":173}," x",[44,4168,2021],{"class":53},[44,4170,1494],{"class":50},[44,4172,2586],{"class":53},[44,4174,4175],{"class":46,"line":474},[44,4176,2239],{"class":53},[44,4178,4179,4181,4183,4185],{"class":46,"line":995},[44,4180,2244],{"class":50},[44,4182,54],{"class":53},[44,4184,1316],{"class":50},[44,4186,4187],{"class":53}," x;\n",[44,4189,4190],{"class":46,"line":1000},[44,4191,2256],{"class":53},[44,4193,4194],{"class":46,"line":1019},[44,4195,903],{"emptyLinePlaceholder":902},[44,4197,4198,4200,4202,4204,4206,4208,4210,4212,4214],{"class":46,"line":1044},[44,4199,1790],{"class":50},[44,4201,254],{"class":50},[44,4203,1825],{"class":53},[44,4205,57],{"class":50},[44,4207,1687],{"class":164},[44,4209,168],{"class":53},[44,4211,1871],{"class":60},[44,4213,620],{"class":53},[44,4215,4216],{"class":67},"  // 编译期计算\n",[44,4218,4219,4221,4223,4225,4227,4229,4231,4233],{"class":46,"line":1049},[44,4220,201],{"class":164},[44,4222,1475],{"class":53},[44,4224,1025],{"class":50},[44,4226,1825],{"class":53},[44,4228,1025],{"class":50},[44,4230,943],{"class":164},[44,4232,2028],{"class":53},[44,4234,4235],{"class":67}," // 输出 25\n",[44,4237,4238],{"class":46,"line":1060},[44,4239,903],{"emptyLinePlaceholder":902},[44,4241,4242,4244,4246,4248,4250],{"class":46,"line":1065},[44,4243,201],{"class":164},[44,4245,1475],{"class":53},[44,4247,1025],{"class":50},[44,4249,1893],{"class":81},[44,4251,227],{"class":53},[44,4253,4254,4256,4258,4260],{"class":46,"line":1075},[44,4255,201],{"class":164},[44,4257,1903],{"class":53},[44,4259,1906],{"class":164},[44,4261,1909],{"class":53},[44,4263,4264,4266,4268],{"class":46,"line":1815},[44,4265,221],{"class":50},[44,4267,224],{"class":60},[44,4269,227],{"class":53},[44,4271,4272],{"class":46,"line":1820},[44,4273,233],{"class":53},[10,4275,4276],{},[1194,4277],{"alt":40,"src":4278},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/10/05/image11.webp",[10,4280,4281,4282,4285,4286,4288,4289,4292],{},"上面",[24,4283,4284],{},"constexpr auto square = [](int x) constexpr"," 有俩",[24,4287,1494],{},"，第一个是用来声明",[24,4290,4291],{},"square","的，第二个是用来声明Lambda的，作用不一样，而且这俩都必须要。",[10,4294,4295,4296,4299],{},"要在这句里实现完整的 ",[818,4297,4298],{},"编译期调用 + 编译期结果存储"," ，你必须要：",[1103,4301,4302,4308],{},[99,4303,4304,4305,4307],{},"lambda 自己是 ",[24,4306,1494],{}," 的（可以编译期执行）；",[99,4309,4310,4311,4313,4314,4316],{},"返回值是编译期常量（用 ",[24,4312,1494],{}," 声明 ",[24,4315,4291],{}," 变量）；",[10,4318,4319],{},"否则：",[1103,4321,4322,4335],{},[99,4323,4324,4325,4327,4328,4331,4332,4334],{},"如果你只写 lambda 是 ",[24,4326,1494],{},"，但没有 ",[24,4329,4330],{},"constexpr auto square =","，",[24,4333,4291],{}," 变量还是运行期的；",[99,4336,4337,4338,4340],{},"如果你只写 ",[24,4339,4330],{},"，但 lambda 不能编译期执行，那编译会报错。",[17,4342,4344],{"id":4343},"stdbind","std::bind",[812,4346,1930],{"id":4347},"定义-1",[10,4349,4350,4352,4353,4356],{},[24,4351,4344],{}," 是 C++11 引入的一个函数适配器，可以用来 ",[818,4354,4355],{},"绑定函数的参数、重排参数顺序、生成可调用对象（函数对象）"," ，常用在需要把函数“提前部分绑定参数”或“适配成某种形式”的场景。",[35,4358,4360],{"className":37,"code":4359,"language":39,"meta":40,"style":40},"#include \u003Cfunctional>\n\nauto new_func = std::bind(函数名, 参数1, 参数2, ...);\n",[24,4361,4362,4369,4373],{"__ignoreMap":40},[44,4363,4364,4366],{"class":46,"line":47},[44,4365,153],{"class":50},[44,4367,4368],{"class":81}," \u003Cfunctional>\n",[44,4370,4371],{"class":46,"line":71},[44,4372,903],{"emptyLinePlaceholder":902},[44,4374,4375,4377,4380,4382,4384,4386,4389],{"class":46,"line":192},[44,4376,26],{"class":50},[44,4378,4379],{"class":53}," new_func ",[44,4381,57],{"class":50},[44,4383,943],{"class":164},[44,4385,204],{"class":53},[44,4387,4388],{"class":164},"bind",[44,4390,4391],{"class":53},"(函数名, 参数1, 参数2, ...);\n",[10,4393,4394],{},"参数可以是具体值，表示提前绑定；",[10,4396,4397,4398,614,4401,4404],{},"也可以是 ",[24,4399,4400],{},"_1",[24,4402,4403],{},"_2"," 等占位符，表示“调用时再传入”；",[10,4406,4407,614,4410,4412],{},[24,4408,4409],{},"std::placeholders::_1",[24,4411,4403],{}," 表示调用时提供的第一个、第二个参数…",[812,4414,2136],{"id":4415},"基础用法-1",[96,4417,4418],{},[99,4419,4420],{},"绑定普通函数的部分参数",[35,4422,4424],{"className":37,"code":4423,"language":39,"meta":40,"style":40},"#include \u003Ciostream>\n#include \u003Cfunctional>\n\nvoid add(int a, int b,int c) \n{\n    std::cout \u003C\u003C a + b + c \u003C\u003C std::endl;\n}\n\nint main() \n{   \n    //把第一个参数固定为 10，第二、三个等调用时再传\n    auto func1 = std::bind(add,10,std::placeholders::_1,std::placeholders::_2);\n    func1(20,30);   //10+20+30\n\n    std::cout \u003C\u003C \"Press Enter to continue...\";\n    std::cin.get();\n    return 0;\n}\n",[24,4425,4426,4432,4438,4442,4469,4473,4497,4501,4505,4513,4518,4523,4565,4585,4589,4601,4611,4619],{"__ignoreMap":40},[44,4427,4428,4430],{"class":46,"line":47},[44,4429,153],{"class":50},[44,4431,932],{"class":81},[44,4433,4434,4436],{"class":46,"line":71},[44,4435,153],{"class":50},[44,4437,4368],{"class":81},[44,4439,4440],{"class":46,"line":192},[44,4441,903],{"emptyLinePlaceholder":902},[44,4443,4444,4447,4449,4451,4453,4455,4457,4459,4461,4463,4465,4467],{"class":46,"line":198},[44,4445,4446],{"class":50},"void",[44,4448,2010],{"class":164},[44,4450,168],{"class":53},[44,4452,161],{"class":50},[44,4454,1965],{"class":173},[44,4456,614],{"class":53},[44,4458,161],{"class":50},[44,4460,1972],{"class":173},[44,4462,177],{"class":53},[44,4464,161],{"class":50},[44,4466,2441],{"class":173},[44,4468,1697],{"class":53},[44,4470,4471],{"class":46,"line":218},[44,4472,195],{"class":53},[44,4474,4475,4477,4479,4481,4483,4485,4487,4489,4491,4493,4495],{"class":46,"line":230},[44,4476,201],{"class":164},[44,4478,1475],{"class":53},[44,4480,1025],{"class":50},[44,4482,430],{"class":53},[44,4484,1992],{"class":50},[44,4486,445],{"class":53},[44,4488,1992],{"class":50},[44,4490,1795],{"class":53},[44,4492,1025],{"class":50},[44,4494,943],{"class":164},[44,4496,1487],{"class":53},[44,4498,4499],{"class":46,"line":474},[44,4500,233],{"class":53},[44,4502,4503],{"class":46,"line":995},[44,4504,903],{"emptyLinePlaceholder":902},[44,4506,4507,4509,4511],{"class":46,"line":1000},[44,4508,161],{"class":50},[44,4510,165],{"class":164},[44,4512,1729],{"class":53},[44,4514,4515],{"class":46,"line":1019},[44,4516,4517],{"class":53},"{   \n",[44,4519,4520],{"class":46,"line":1044},[44,4521,4522],{"class":67},"    //把第一个参数固定为 10，第二、三个等调用时再传\n",[44,4524,4525,4527,4530,4532,4534,4536,4538,4541,4544,4546,4548,4550,4553,4556,4558,4560,4562],{"class":46,"line":1049},[44,4526,2216],{"class":50},[44,4528,4529],{"class":53}," func1 ",[44,4531,57],{"class":50},[44,4533,943],{"class":164},[44,4535,204],{"class":53},[44,4537,4388],{"class":164},[44,4539,4540],{"class":53},"(add,",[44,4542,4543],{"class":60},"10",[44,4545,177],{"class":53},[44,4547,292],{"class":164},[44,4549,204],{"class":53},[44,4551,4552],{"class":164},"placeholders",[44,4554,4555],{"class":53},"::_1,",[44,4557,292],{"class":164},[44,4559,204],{"class":53},[44,4561,4552],{"class":164},[44,4563,4564],{"class":53},"::_2);\n",[44,4566,4567,4570,4572,4575,4577,4580,4582],{"class":46,"line":1060},[44,4568,4569],{"class":164},"    func1",[44,4571,168],{"class":53},[44,4573,4574],{"class":60},"20",[44,4576,177],{"class":53},[44,4578,4579],{"class":60},"30",[44,4581,620],{"class":53},[44,4583,4584],{"class":67},"   //10+20+30\n",[44,4586,4587],{"class":46,"line":1065},[44,4588,903],{"emptyLinePlaceholder":902},[44,4590,4591,4593,4595,4597,4599],{"class":46,"line":1075},[44,4592,201],{"class":164},[44,4594,1475],{"class":53},[44,4596,1025],{"class":50},[44,4598,1893],{"class":81},[44,4600,227],{"class":53},[44,4602,4603,4605,4607,4609],{"class":46,"line":1815},[44,4604,201],{"class":164},[44,4606,1903],{"class":53},[44,4608,1906],{"class":164},[44,4610,1909],{"class":53},[44,4612,4613,4615,4617],{"class":46,"line":1820},[44,4614,221],{"class":50},[44,4616,224],{"class":60},[44,4618,227],{"class":53},[44,4620,4621],{"class":46,"line":1835},[44,4622,233],{"class":53},[10,4624,4625],{},[1194,4626],{"alt":40,"src":4627},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/10/05/image12.webp",[96,4629,4630],{"start":71},[99,4631,4632],{},"绑定成员函数",[10,4634,4635],{},"注意💡：函数出现了第0个参数（也可看作第一个参数，反正就是多一个默认的参数），这个参数是对象的指针，这是因为成员函数需要一个this。不知道为何要这么做的话，请你好好学学class,先打好基础。",[35,4637,4639],{"className":37,"code":4638,"language":39,"meta":40,"style":40},"#include \u003Ciostream>\n#include \u003Cfunctional>\n\nclass MyClass\n{\n    public:\n        int add(int a, int b,int c) \n        {\n            return a+b+c;\n        }\n};\n\nint main() \n{   \n    MyClass obj;\n    //函数出现了第0个参数，这个参数是对象的指针，这是因为成员函数需要一个this。\n    //把第一个参数固定为 10，第二、三个等调用时再传\n    auto func1 = std::bind(&MyClass::add,&obj,10,std::placeholders::_1,std::placeholders::_2);\n    int result = func1(20,30);   //10+20+30\n    std::cout \u003C\u003C \"result:\" \u003C\u003C result \u003C\u003C std::endl;\n\n    std::cout \u003C\u003C \"Press Enter to continue...\";\n    std::cin.get();\n    return 0;\n}\n\n",[24,4640,4641,4647,4653,4657,4664,4668,4672,4698,4702,4718,4722,4726,4730,4738,4742,4746,4751,4755,4804,4828,4849,4853,4865,4875,4883],{"__ignoreMap":40},[44,4642,4643,4645],{"class":46,"line":47},[44,4644,153],{"class":50},[44,4646,932],{"class":81},[44,4648,4649,4651],{"class":46,"line":71},[44,4650,153],{"class":50},[44,4652,4368],{"class":81},[44,4654,4655],{"class":46,"line":192},[44,4656,903],{"emptyLinePlaceholder":902},[44,4658,4659,4661],{"class":46,"line":198},[44,4660,2580],{"class":50},[44,4662,4663],{"class":164}," MyClass\n",[44,4665,4666],{"class":46,"line":218},[44,4667,195],{"class":53},[44,4669,4670],{"class":46,"line":230},[44,4671,2595],{"class":50},[44,4673,4674,4676,4678,4680,4682,4684,4686,4688,4690,4692,4694,4696],{"class":46,"line":474},[44,4675,2600],{"class":50},[44,4677,2010],{"class":164},[44,4679,168],{"class":53},[44,4681,161],{"class":50},[44,4683,1965],{"class":173},[44,4685,614],{"class":53},[44,4687,161],{"class":50},[44,4689,1972],{"class":173},[44,4691,177],{"class":53},[44,4693,161],{"class":50},[44,4695,2441],{"class":173},[44,4697,1697],{"class":53},[44,4699,4700],{"class":46,"line":995},[44,4701,2628],{"class":53},[44,4703,4704,4706,4708,4710,4713,4715],{"class":46,"line":1000},[44,4705,3888],{"class":50},[44,4707,1965],{"class":53},[44,4709,1992],{"class":50},[44,4711,4712],{"class":53},"b",[44,4714,1992],{"class":50},[44,4716,4717],{"class":53},"c;\n",[44,4719,4720],{"class":46,"line":1019},[44,4721,2754],{"class":53},[44,4723,4724],{"class":46,"line":1044},[44,4725,1379],{"class":53},[44,4727,4728],{"class":46,"line":1049},[44,4729,903],{"emptyLinePlaceholder":902},[44,4731,4732,4734,4736],{"class":46,"line":1060},[44,4733,161],{"class":50},[44,4735,165],{"class":164},[44,4737,1729],{"class":53},[44,4739,4740],{"class":46,"line":1065},[44,4741,4517],{"class":53},[44,4743,4744],{"class":46,"line":1075},[44,4745,2777],{"class":53},[44,4747,4748],{"class":46,"line":1815},[44,4749,4750],{"class":67},"    //函数出现了第0个参数，这个参数是对象的指针，这是因为成员函数需要一个this。\n",[44,4752,4753],{"class":46,"line":1820},[44,4754,4522],{"class":67},[44,4756,4757,4759,4761,4763,4765,4767,4769,4771,4773,4776,4779,4781,4784,4786,4788,4790,4792,4794,4796,4798,4800,4802],{"class":46,"line":1835},[44,4758,2216],{"class":50},[44,4760,4529],{"class":53},[44,4762,57],{"class":50},[44,4764,943],{"class":164},[44,4766,204],{"class":53},[44,4768,4388],{"class":164},[44,4770,168],{"class":53},[44,4772,2098],{"class":50},[44,4774,4775],{"class":164},"MyClass",[44,4777,4778],{"class":53},"::add,",[44,4780,2098],{"class":50},[44,4782,4783],{"class":53},"obj,",[44,4785,4543],{"class":60},[44,4787,177],{"class":53},[44,4789,292],{"class":164},[44,4791,204],{"class":53},[44,4793,4552],{"class":164},[44,4795,4555],{"class":53},[44,4797,292],{"class":164},[44,4799,204],{"class":53},[44,4801,4552],{"class":164},[44,4803,4564],{"class":53},[44,4805,4806,4808,4811,4813,4816,4818,4820,4822,4824,4826],{"class":46,"line":1855},[44,4807,1756],{"class":50},[44,4809,4810],{"class":53}," result ",[44,4812,57],{"class":50},[44,4814,4815],{"class":164}," func1",[44,4817,168],{"class":53},[44,4819,4574],{"class":60},[44,4821,177],{"class":53},[44,4823,4579],{"class":60},[44,4825,620],{"class":53},[44,4827,4584],{"class":67},[44,4829,4830,4832,4834,4836,4839,4841,4843,4845,4847],{"class":46,"line":1879},[44,4831,201],{"class":164},[44,4833,1475],{"class":53},[44,4835,1025],{"class":50},[44,4837,4838],{"class":81}," \"result:\"",[44,4840,1031],{"class":50},[44,4842,4810],{"class":53},[44,4844,1025],{"class":50},[44,4846,943],{"class":164},[44,4848,1487],{"class":53},[44,4850,4851],{"class":46,"line":1884},[44,4852,903],{"emptyLinePlaceholder":902},[44,4854,4855,4857,4859,4861,4863],{"class":46,"line":1898},[44,4856,201],{"class":164},[44,4858,1475],{"class":53},[44,4860,1025],{"class":50},[44,4862,1893],{"class":81},[44,4864,227],{"class":53},[44,4866,4867,4869,4871,4873],{"class":46,"line":1912},[44,4868,201],{"class":164},[44,4870,1903],{"class":53},[44,4872,1906],{"class":164},[44,4874,1909],{"class":53},[44,4876,4877,4879,4881],{"class":46,"line":1921},[44,4878,221],{"class":50},[44,4880,224],{"class":60},[44,4882,227],{"class":53},[44,4884,4885],{"class":46,"line":2774},[44,4886,233],{"class":53},[10,4888,4889],{},[1194,4890],{"alt":40,"src":4891},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/10/05/image13.webp",[96,4893,4894],{"start":192},[99,4895,4896],{},"用于高阶函数",[10,4898,4899],{},"高阶函数其实就是把函数当作入口参数或者返回值，不懂的话，本文档也有讲，可以先去看看。（或者学完高阶函数再回来学这个）",[10,4901,4902,4903,4905],{},"比如你要把类的普通成员函数作为入口参数给某个函数，普通函数指针不支持，但 ",[24,4904,4344],{}," 就可以：",[35,4907,4909],{"className":37,"code":4908,"language":39,"meta":40,"style":40},"#include \u003Ciostream>\n#include \u003Cfunctional>\n\nvoid DoSomething(std::function\u003Cint(int,int)> func)\n{\n    std::cout \u003C\u003C func(20,30) \u003C\u003C std::endl;\n}\n\nclass MyClass\n{\n    public:\n        int add(int a, int b, int c) \n        {\n            return a+b+c;\n        }\n};\n\nint main() \n{   \n    MyClass obj;\n\n    // 绑定 a = 10，b = _1，c = _2\n    DoSomething(std::bind(&MyClass::add,&obj,10,std::placeholders::_1,std::placeholders::_2));\nscr\n    std::cout \u003C\u003C \"Press Enter to continue...\";\n    std::cin.get();\n    return 0;\n}\n\n",[24,4910,4911,4917,4923,4927,4963,4967,4994,4998,5002,5008,5012,5016,5042,5046,5060,5064,5068,5072,5080,5084,5088,5092,5097,5143,5148,5160,5170,5178],{"__ignoreMap":40},[44,4912,4913,4915],{"class":46,"line":47},[44,4914,153],{"class":50},[44,4916,932],{"class":81},[44,4918,4919,4921],{"class":46,"line":71},[44,4920,153],{"class":50},[44,4922,4368],{"class":81},[44,4924,4925],{"class":46,"line":192},[44,4926,903],{"emptyLinePlaceholder":902},[44,4928,4929,4931,4934,4936,4938,4940,4943,4945,4947,4949,4951,4953,4955,4958,4961],{"class":46,"line":198},[44,4930,4446],{"class":50},[44,4932,4933],{"class":164}," DoSomething",[44,4935,168],{"class":53},[44,4937,292],{"class":164},[44,4939,204],{"class":53},[44,4941,4942],{"class":164},"function",[44,4944,1295],{"class":53},[44,4946,161],{"class":50},[44,4948,168],{"class":53},[44,4950,161],{"class":50},[44,4952,177],{"class":53},[44,4954,161],{"class":50},[44,4956,4957],{"class":53},")> ",[44,4959,4960],{"class":173},"func",[44,4962,189],{"class":53},[44,4964,4965],{"class":46,"line":218},[44,4966,195],{"class":53},[44,4968,4969,4971,4973,4975,4978,4980,4982,4984,4986,4988,4990,4992],{"class":46,"line":230},[44,4970,201],{"class":164},[44,4972,1475],{"class":53},[44,4974,1025],{"class":50},[44,4976,4977],{"class":164}," func",[44,4979,168],{"class":53},[44,4981,4574],{"class":60},[44,4983,177],{"class":53},[44,4985,4579],{"class":60},[44,4987,2021],{"class":53},[44,4989,1025],{"class":50},[44,4991,943],{"class":164},[44,4993,1487],{"class":53},[44,4995,4996],{"class":46,"line":474},[44,4997,233],{"class":53},[44,4999,5000],{"class":46,"line":995},[44,5001,903],{"emptyLinePlaceholder":902},[44,5003,5004,5006],{"class":46,"line":1000},[44,5005,2580],{"class":50},[44,5007,4663],{"class":164},[44,5009,5010],{"class":46,"line":1019},[44,5011,195],{"class":53},[44,5013,5014],{"class":46,"line":1044},[44,5015,2595],{"class":50},[44,5017,5018,5020,5022,5024,5026,5028,5030,5032,5034,5036,5038,5040],{"class":46,"line":1049},[44,5019,2600],{"class":50},[44,5021,2010],{"class":164},[44,5023,168],{"class":53},[44,5025,161],{"class":50},[44,5027,1965],{"class":173},[44,5029,614],{"class":53},[44,5031,161],{"class":50},[44,5033,1972],{"class":173},[44,5035,614],{"class":53},[44,5037,161],{"class":50},[44,5039,2441],{"class":173},[44,5041,1697],{"class":53},[44,5043,5044],{"class":46,"line":1060},[44,5045,2628],{"class":53},[44,5047,5048,5050,5052,5054,5056,5058],{"class":46,"line":1065},[44,5049,3888],{"class":50},[44,5051,1965],{"class":53},[44,5053,1992],{"class":50},[44,5055,4712],{"class":53},[44,5057,1992],{"class":50},[44,5059,4717],{"class":53},[44,5061,5062],{"class":46,"line":1075},[44,5063,2754],{"class":53},[44,5065,5066],{"class":46,"line":1815},[44,5067,1379],{"class":53},[44,5069,5070],{"class":46,"line":1820},[44,5071,903],{"emptyLinePlaceholder":902},[44,5073,5074,5076,5078],{"class":46,"line":1835},[44,5075,161],{"class":50},[44,5077,165],{"class":164},[44,5079,1729],{"class":53},[44,5081,5082],{"class":46,"line":1855},[44,5083,4517],{"class":53},[44,5085,5086],{"class":46,"line":1879},[44,5087,2777],{"class":53},[44,5089,5090],{"class":46,"line":1884},[44,5091,903],{"emptyLinePlaceholder":902},[44,5093,5094],{"class":46,"line":1898},[44,5095,5096],{"class":67},"    // 绑定 a = 10，b = _1，c = _2\n",[44,5098,5099,5102,5104,5106,5108,5110,5112,5114,5116,5118,5120,5122,5124,5126,5128,5130,5132,5134,5136,5138,5140],{"class":46,"line":1912},[44,5100,5101],{"class":164},"    DoSomething",[44,5103,168],{"class":53},[44,5105,292],{"class":164},[44,5107,204],{"class":53},[44,5109,4388],{"class":164},[44,5111,168],{"class":53},[44,5113,2098],{"class":50},[44,5115,4775],{"class":164},[44,5117,4778],{"class":53},[44,5119,2098],{"class":50},[44,5121,4783],{"class":53},[44,5123,4543],{"class":60},[44,5125,177],{"class":53},[44,5127,292],{"class":164},[44,5129,204],{"class":53},[44,5131,4552],{"class":164},[44,5133,4555],{"class":53},[44,5135,292],{"class":164},[44,5137,204],{"class":53},[44,5139,4552],{"class":164},[44,5141,5142],{"class":53},"::_2));\n",[44,5144,5145],{"class":46,"line":1921},[44,5146,5147],{"class":53},"scr\n",[44,5149,5150,5152,5154,5156,5158],{"class":46,"line":2774},[44,5151,201],{"class":164},[44,5153,1475],{"class":53},[44,5155,1025],{"class":50},[44,5157,1893],{"class":81},[44,5159,227],{"class":53},[44,5161,5162,5164,5166,5168],{"class":46,"line":2780},[44,5163,201],{"class":164},[44,5165,1903],{"class":53},[44,5167,1906],{"class":164},[44,5169,1909],{"class":53},[44,5171,5172,5174,5176],{"class":46,"line":2791},[44,5173,221],{"class":50},[44,5175,224],{"class":60},[44,5177,227],{"class":53},[44,5179,5180],{"class":46,"line":2796},[44,5181,233],{"class":53},[10,5183,5184],{},[1194,5185],{"alt":40,"src":5186},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/10/05/image14.webp",[17,5188,5189],{"id":5189},"高阶函数",[10,5191,5192,5193,5196],{},"高阶函数并非现代C++的东西，他其实是C语言就拥有的东西，但是现代C++提供了",[24,5194,5195],{},"std::function"," 更灵活，能接收函数指针、Lambda、函数对象等。",[10,5198,5199],{},"从这里开始，你将接触函数式编程。",[10,5201,5202],{},"定义：在 C/C++ 中，一个函数如果符合以下任意条件，就可以称为“高阶函数”：",[96,5204,5205,5210],{},[99,5206,5207],{},[818,5208,5209],{},"接受函数作为参数",[99,5211,5212],{},[818,5213,5214],{},"返回一个函数",[812,5216,5217],{"id":5217},"函数指针",[5219,5220,5221],"h5",{"id":5221},"什么是函数指针",[10,5223,5224,5225,5228],{},"函数指针是指向函数的指针，它可以指向 ",[818,5226,5227],{},"具有特定参数和返回值类型"," 的函数。",[10,5230,5231,5232],{},"以下是",[818,5233,5234],{},"最基础的用法",[10,5236,5237],{},"可以把他类比于普通的变量指针来看",[35,5239,5241],{"className":37,"code":5240,"language":39,"meta":40,"style":40},"#include \u003Ciostream>\n\nint add(int a, int b) \n{\n    return a + b;\n}\n\nint main(int argc,char **argv) \n{\n    // 函数指针声明\n    int (*func_ptr)(int, int);  // 指向返回int、接收两个int参数的函数的指针\n\n    // 将函数地址赋给函数指针\n    func_ptr = add;\n\n    int result = func_ptr(3, 4);  // 等同于 add(3, 4)\n    std::cout \u003C\u003C result \u003C\u003C std::endl;  // 输出 7\n\n    std::cout \u003C\u003C \"Press Enter to continue...\";\n    std::cin.get(); // 等待用户按下回车键\n    return 0;\n}\n",[24,5242,5243,5249,5253,5273,5277,5287,5291,5295,5317,5321,5326,5344,5348,5353,5363,5367,5391,5410,5414,5426,5438,5446],{"__ignoreMap":40},[44,5244,5245,5247],{"class":46,"line":47},[44,5246,153],{"class":50},[44,5248,932],{"class":81},[44,5250,5251],{"class":46,"line":71},[44,5252,903],{"emptyLinePlaceholder":902},[44,5254,5255,5257,5259,5261,5263,5265,5267,5269,5271],{"class":46,"line":192},[44,5256,161],{"class":50},[44,5258,2010],{"class":164},[44,5260,168],{"class":53},[44,5262,161],{"class":50},[44,5264,1965],{"class":173},[44,5266,614],{"class":53},[44,5268,161],{"class":50},[44,5270,1972],{"class":173},[44,5272,1697],{"class":53},[44,5274,5275],{"class":46,"line":198},[44,5276,195],{"class":53},[44,5278,5279,5281,5283,5285],{"class":46,"line":218},[44,5280,221],{"class":50},[44,5282,430],{"class":53},[44,5284,1992],{"class":50},[44,5286,2251],{"class":53},[44,5288,5289],{"class":46,"line":230},[44,5290,233],{"class":53},[44,5292,5293],{"class":46,"line":474},[44,5294,903],{"emptyLinePlaceholder":902},[44,5296,5297,5299,5301,5303,5305,5307,5309,5311,5313,5315],{"class":46,"line":995},[44,5298,161],{"class":50},[44,5300,165],{"class":164},[44,5302,168],{"class":53},[44,5304,161],{"class":50},[44,5306,174],{"class":173},[44,5308,177],{"class":53},[44,5310,180],{"class":50},[44,5312,183],{"class":50},[44,5314,186],{"class":173},[44,5316,1697],{"class":53},[44,5318,5319],{"class":46,"line":1000},[44,5320,195],{"class":53},[44,5322,5323],{"class":46,"line":1019},[44,5324,5325],{"class":67},"    // 函数指针声明\n",[44,5327,5328,5330,5333,5335,5337,5339,5341],{"class":46,"line":1044},[44,5329,1756],{"class":50},[44,5331,5332],{"class":53}," (*func_ptr)(",[44,5334,161],{"class":50},[44,5336,614],{"class":53},[44,5338,161],{"class":50},[44,5340,620],{"class":53},[44,5342,5343],{"class":67},"  // 指向返回int、接收两个int参数的函数的指针\n",[44,5345,5346],{"class":46,"line":1049},[44,5347,903],{"emptyLinePlaceholder":902},[44,5349,5350],{"class":46,"line":1060},[44,5351,5352],{"class":67},"    // 将函数地址赋给函数指针\n",[44,5354,5355,5358,5360],{"class":46,"line":1065},[44,5356,5357],{"class":53},"    func_ptr ",[44,5359,57],{"class":50},[44,5361,5362],{"class":53}," add;\n",[44,5364,5365],{"class":46,"line":1075},[44,5366,903],{"emptyLinePlaceholder":902},[44,5368,5369,5371,5373,5375,5378,5380,5382,5384,5386,5388],{"class":46,"line":1815},[44,5370,1756],{"class":50},[44,5372,4810],{"class":53},[44,5374,57],{"class":50},[44,5376,5377],{"class":164}," func_ptr",[44,5379,168],{"class":53},[44,5381,1376],{"class":60},[44,5383,614],{"class":53},[44,5385,1449],{"class":60},[44,5387,620],{"class":53},[44,5389,5390],{"class":67},"  // 等同于 add(3, 4)\n",[44,5392,5393,5395,5397,5399,5401,5403,5405,5407],{"class":46,"line":1820},[44,5394,201],{"class":164},[44,5396,1475],{"class":53},[44,5398,1025],{"class":50},[44,5400,4810],{"class":53},[44,5402,1025],{"class":50},[44,5404,943],{"class":164},[44,5406,2028],{"class":53},[44,5408,5409],{"class":67},"  // 输出 7\n",[44,5411,5412],{"class":46,"line":1835},[44,5413,903],{"emptyLinePlaceholder":902},[44,5415,5416,5418,5420,5422,5424],{"class":46,"line":1855},[44,5417,201],{"class":164},[44,5419,1475],{"class":53},[44,5421,1025],{"class":50},[44,5423,1893],{"class":81},[44,5425,227],{"class":53},[44,5427,5428,5430,5432,5434,5436],{"class":46,"line":1879},[44,5429,201],{"class":164},[44,5431,1903],{"class":53},[44,5433,1906],{"class":164},[44,5435,2306],{"class":53},[44,5437,2309],{"class":67},[44,5439,5440,5442,5444],{"class":46,"line":1884},[44,5441,221],{"class":50},[44,5443,224],{"class":60},[44,5445,227],{"class":53},[44,5447,5448],{"class":46,"line":1898},[44,5449,233],{"class":53},[10,5451,5452],{},[1194,5453],{"alt":40,"src":5454},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/10/05/image15.webp",[10,5456,5457],{},[818,5458,5459,5460,5464],{},"把",[818,5461,5462],{},[818,5463,5217],{},"作为参数传给函数",[10,5466,5467,5468,5471,5472],{},"普通变量声明是",[24,5469,5470],{},"int x",",函数声明",[24,5473,5474],{},"int (*op)(int, int)",[35,5476,5478],{"className":37,"code":5477,"language":39,"meta":40,"style":40},"#include \u003Ciostream>\n\nint add(int a, int b)\n{\n    return a + b;\n}\n\nint sub(int a, int b)\n{\n    return a - b;\n}\n\n// 高阶函数：接收函数指针作为参数\nvoid calc(int x, int y, int (*op)(int, int)) \n{\n    int result = op(x, y);\n    std::cout \u003C\u003C \"Result: \" \u003C\u003C result \u003C\u003C std::endl;\n}\n\nint main(int argc,char **argv)\n{\n    calc(5,3,add);\n    calc(5,3,sub);\n\n    std::cout \u003C\u003C \"Press Enter to continue...\";\n    std::cin.get(); // 等待用户按下回车键\n    return 0;\n}\n",[24,5479,5480,5486,5490,5510,5514,5524,5528,5532,5553,5557,5567,5571,5575,5580,5622,5626,5640,5661,5665,5669,5691,5695,5711,5726,5730,5742,5754,5762],{"__ignoreMap":40},[44,5481,5482,5484],{"class":46,"line":47},[44,5483,153],{"class":50},[44,5485,932],{"class":81},[44,5487,5488],{"class":46,"line":71},[44,5489,903],{"emptyLinePlaceholder":902},[44,5491,5492,5494,5496,5498,5500,5502,5504,5506,5508],{"class":46,"line":192},[44,5493,161],{"class":50},[44,5495,2010],{"class":164},[44,5497,168],{"class":53},[44,5499,161],{"class":50},[44,5501,1965],{"class":173},[44,5503,614],{"class":53},[44,5505,161],{"class":50},[44,5507,1972],{"class":173},[44,5509,189],{"class":53},[44,5511,5512],{"class":46,"line":198},[44,5513,195],{"class":53},[44,5515,5516,5518,5520,5522],{"class":46,"line":218},[44,5517,221],{"class":50},[44,5519,430],{"class":53},[44,5521,1992],{"class":50},[44,5523,2251],{"class":53},[44,5525,5526],{"class":46,"line":230},[44,5527,233],{"class":53},[44,5529,5530],{"class":46,"line":474},[44,5531,903],{"emptyLinePlaceholder":902},[44,5533,5534,5536,5539,5541,5543,5545,5547,5549,5551],{"class":46,"line":995},[44,5535,161],{"class":50},[44,5537,5538],{"class":164}," sub",[44,5540,168],{"class":53},[44,5542,161],{"class":50},[44,5544,1965],{"class":173},[44,5546,614],{"class":53},[44,5548,161],{"class":50},[44,5550,1972],{"class":173},[44,5552,189],{"class":53},[44,5554,5555],{"class":46,"line":1000},[44,5556,195],{"class":53},[44,5558,5559,5561,5563,5565],{"class":46,"line":1019},[44,5560,221],{"class":50},[44,5562,430],{"class":53},[44,5564,839],{"class":50},[44,5566,2251],{"class":53},[44,5568,5569],{"class":46,"line":1044},[44,5570,233],{"class":53},[44,5572,5573],{"class":46,"line":1049},[44,5574,903],{"emptyLinePlaceholder":902},[44,5576,5577],{"class":46,"line":1060},[44,5578,5579],{"class":67},"// 高阶函数：接收函数指针作为参数\n",[44,5581,5582,5584,5587,5589,5591,5593,5595,5597,5600,5602,5604,5607,5610,5613,5615,5617,5619],{"class":46,"line":1065},[44,5583,4446],{"class":50},[44,5585,5586],{"class":164}," calc",[44,5588,168],{"class":53},[44,5590,161],{"class":50},[44,5592,4166],{"class":173},[44,5594,614],{"class":53},[44,5596,161],{"class":50},[44,5598,5599],{"class":173}," y",[44,5601,614],{"class":53},[44,5603,161],{"class":50},[44,5605,5606],{"class":53}," (*",[44,5608,5609],{"class":173},"op",[44,5611,5612],{"class":53},")(",[44,5614,161],{"class":50},[44,5616,614],{"class":53},[44,5618,161],{"class":50},[44,5620,5621],{"class":53},")) \n",[44,5623,5624],{"class":46,"line":1075},[44,5625,195],{"class":53},[44,5627,5628,5630,5632,5634,5637],{"class":46,"line":1815},[44,5629,1756],{"class":50},[44,5631,4810],{"class":53},[44,5633,57],{"class":50},[44,5635,5636],{"class":164}," op",[44,5638,5639],{"class":53},"(x, y);\n",[44,5641,5642,5644,5646,5648,5651,5653,5655,5657,5659],{"class":46,"line":1820},[44,5643,201],{"class":164},[44,5645,1475],{"class":53},[44,5647,1025],{"class":50},[44,5649,5650],{"class":81}," \"Result: \"",[44,5652,1031],{"class":50},[44,5654,4810],{"class":53},[44,5656,1025],{"class":50},[44,5658,943],{"class":164},[44,5660,1487],{"class":53},[44,5662,5663],{"class":46,"line":1835},[44,5664,233],{"class":53},[44,5666,5667],{"class":46,"line":1855},[44,5668,903],{"emptyLinePlaceholder":902},[44,5670,5671,5673,5675,5677,5679,5681,5683,5685,5687,5689],{"class":46,"line":1879},[44,5672,161],{"class":50},[44,5674,165],{"class":164},[44,5676,168],{"class":53},[44,5678,161],{"class":50},[44,5680,174],{"class":173},[44,5682,177],{"class":53},[44,5684,180],{"class":50},[44,5686,183],{"class":50},[44,5688,186],{"class":173},[44,5690,189],{"class":53},[44,5692,5693],{"class":46,"line":1884},[44,5694,195],{"class":53},[44,5696,5697,5700,5702,5704,5706,5708],{"class":46,"line":1898},[44,5698,5699],{"class":164},"    calc",[44,5701,168],{"class":53},[44,5703,1871],{"class":60},[44,5705,177],{"class":53},[44,5707,1376],{"class":60},[44,5709,5710],{"class":53},",add);\n",[44,5712,5713,5715,5717,5719,5721,5723],{"class":46,"line":1912},[44,5714,5699],{"class":164},[44,5716,168],{"class":53},[44,5718,1871],{"class":60},[44,5720,177],{"class":53},[44,5722,1376],{"class":60},[44,5724,5725],{"class":53},",sub);\n",[44,5727,5728],{"class":46,"line":1921},[44,5729,903],{"emptyLinePlaceholder":902},[44,5731,5732,5734,5736,5738,5740],{"class":46,"line":2774},[44,5733,201],{"class":164},[44,5735,1475],{"class":53},[44,5737,1025],{"class":50},[44,5739,1893],{"class":81},[44,5741,227],{"class":53},[44,5743,5744,5746,5748,5750,5752],{"class":46,"line":2780},[44,5745,201],{"class":164},[44,5747,1903],{"class":53},[44,5749,1906],{"class":164},[44,5751,2306],{"class":53},[44,5753,2309],{"class":67},[44,5755,5756,5758,5760],{"class":46,"line":2791},[44,5757,221],{"class":50},[44,5759,224],{"class":60},[44,5761,227],{"class":53},[44,5763,5764],{"class":46,"line":2796},[44,5765,233],{"class":53},[10,5767,5768],{},[1194,5769],{"alt":40,"src":5770},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/10/05/image16.webp",[10,5772,5773],{},[818,5774,5775],{},"函数指针****作为返回值",[35,5777,5779],{"className":37,"code":5778,"language":39,"meta":40,"style":40},"#include \u003Ciostream>\n\nint add(int a, int b)\n{\n    return a + b;\n}\n\nint sub(int a, int b)\n{\n    return a - b;\n}\n\n// 高阶函数：接收函数指针作为参数\nint (*choose(bool compute))(int, int) \n{\n    return compute ? add : sub;\n}\n\nint main(int argc,char **argv)\n{\n    //下面这个auto op等同于int (*op)(int, int)  = choose(true);\n    auto op = choose(true);\n\n    std::cout \u003C\u003C op(4, 2) \u003C\u003C std::endl;  // 输出 6\n\n    std::cout \u003C\u003C \"Press Enter to continue...\";\n    std::cin.get(); // 等待用户按下回车键\n    return 0;\n}\n",[24,5780,5781,5787,5791,5811,5815,5825,5829,5833,5853,5857,5867,5871,5875,5879,5906,5910,5928,5932,5936,5958,5962,5967,5986,5990,6019,6023,6035,6047,6055],{"__ignoreMap":40},[44,5782,5783,5785],{"class":46,"line":47},[44,5784,153],{"class":50},[44,5786,932],{"class":81},[44,5788,5789],{"class":46,"line":71},[44,5790,903],{"emptyLinePlaceholder":902},[44,5792,5793,5795,5797,5799,5801,5803,5805,5807,5809],{"class":46,"line":192},[44,5794,161],{"class":50},[44,5796,2010],{"class":164},[44,5798,168],{"class":53},[44,5800,161],{"class":50},[44,5802,1965],{"class":173},[44,5804,614],{"class":53},[44,5806,161],{"class":50},[44,5808,1972],{"class":173},[44,5810,189],{"class":53},[44,5812,5813],{"class":46,"line":198},[44,5814,195],{"class":53},[44,5816,5817,5819,5821,5823],{"class":46,"line":218},[44,5818,221],{"class":50},[44,5820,430],{"class":53},[44,5822,1992],{"class":50},[44,5824,2251],{"class":53},[44,5826,5827],{"class":46,"line":230},[44,5828,233],{"class":53},[44,5830,5831],{"class":46,"line":474},[44,5832,903],{"emptyLinePlaceholder":902},[44,5834,5835,5837,5839,5841,5843,5845,5847,5849,5851],{"class":46,"line":995},[44,5836,161],{"class":50},[44,5838,5538],{"class":164},[44,5840,168],{"class":53},[44,5842,161],{"class":50},[44,5844,1965],{"class":173},[44,5846,614],{"class":53},[44,5848,161],{"class":50},[44,5850,1972],{"class":173},[44,5852,189],{"class":53},[44,5854,5855],{"class":46,"line":1000},[44,5856,195],{"class":53},[44,5858,5859,5861,5863,5865],{"class":46,"line":1019},[44,5860,221],{"class":50},[44,5862,430],{"class":53},[44,5864,839],{"class":50},[44,5866,2251],{"class":53},[44,5868,5869],{"class":46,"line":1044},[44,5870,233],{"class":53},[44,5872,5873],{"class":46,"line":1049},[44,5874,903],{"emptyLinePlaceholder":902},[44,5876,5877],{"class":46,"line":1060},[44,5878,5579],{"class":67},[44,5880,5881,5883,5885,5887,5890,5892,5895,5898,5900,5902,5904],{"class":46,"line":1065},[44,5882,161],{"class":50},[44,5884,1459],{"class":53},[44,5886,1316],{"class":50},[44,5888,5889],{"class":164},"choose",[44,5891,168],{"class":53},[44,5893,5894],{"class":50},"bool",[44,5896,5897],{"class":53}," compute))(",[44,5899,161],{"class":50},[44,5901,614],{"class":53},[44,5903,161],{"class":50},[44,5905,1697],{"class":53},[44,5907,5908],{"class":46,"line":1075},[44,5909,195],{"class":53},[44,5911,5912,5914,5917,5920,5922,5925],{"class":46,"line":1815},[44,5913,221],{"class":50},[44,5915,5916],{"class":53}," compute ",[44,5918,5919],{"class":50},"?",[44,5921,1955],{"class":53},[44,5923,5924],{"class":50},":",[44,5926,5927],{"class":53}," sub;\n",[44,5929,5930],{"class":46,"line":1820},[44,5931,233],{"class":53},[44,5933,5934],{"class":46,"line":1835},[44,5935,903],{"emptyLinePlaceholder":902},[44,5937,5938,5940,5942,5944,5946,5948,5950,5952,5954,5956],{"class":46,"line":1855},[44,5939,161],{"class":50},[44,5941,165],{"class":164},[44,5943,168],{"class":53},[44,5945,161],{"class":50},[44,5947,174],{"class":173},[44,5949,177],{"class":53},[44,5951,180],{"class":50},[44,5953,183],{"class":50},[44,5955,186],{"class":173},[44,5957,189],{"class":53},[44,5959,5960],{"class":46,"line":1879},[44,5961,195],{"class":53},[44,5963,5964],{"class":46,"line":1884},[44,5965,5966],{"class":67},"    //下面这个auto op等同于int (*op)(int, int)  = choose(true);\n",[44,5968,5969,5971,5974,5976,5979,5981,5984],{"class":46,"line":1898},[44,5970,2216],{"class":50},[44,5972,5973],{"class":53}," op ",[44,5975,57],{"class":50},[44,5977,5978],{"class":164}," choose",[44,5980,168],{"class":53},[44,5982,5983],{"class":60},"true",[44,5985,215],{"class":53},[44,5987,5988],{"class":46,"line":1912},[44,5989,903],{"emptyLinePlaceholder":902},[44,5991,5992,5994,5996,5998,6000,6002,6004,6006,6008,6010,6012,6014,6016],{"class":46,"line":1921},[44,5993,201],{"class":164},[44,5995,1475],{"class":53},[44,5997,1025],{"class":50},[44,5999,5636],{"class":164},[44,6001,168],{"class":53},[44,6003,1449],{"class":60},[44,6005,614],{"class":53},[44,6007,1371],{"class":60},[44,6009,2021],{"class":53},[44,6011,1025],{"class":50},[44,6013,943],{"class":164},[44,6015,2028],{"class":53},[44,6017,6018],{"class":67},"  // 输出 6\n",[44,6020,6021],{"class":46,"line":2774},[44,6022,903],{"emptyLinePlaceholder":902},[44,6024,6025,6027,6029,6031,6033],{"class":46,"line":2780},[44,6026,201],{"class":164},[44,6028,1475],{"class":53},[44,6030,1025],{"class":50},[44,6032,1893],{"class":81},[44,6034,227],{"class":53},[44,6036,6037,6039,6041,6043,6045],{"class":46,"line":2791},[44,6038,201],{"class":164},[44,6040,1903],{"class":53},[44,6042,1906],{"class":164},[44,6044,2306],{"class":53},[44,6046,2309],{"class":67},[44,6048,6049,6051,6053],{"class":46,"line":2796},[44,6050,221],{"class":50},[44,6052,224],{"class":60},[44,6054,227],{"class":53},[44,6056,6057],{"class":46,"line":2809},[44,6058,233],{"class":53},[10,6060,6061],{},[1194,6062],{"alt":40,"src":6063},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/10/05/image17.webp",[5219,6065,6066],{"id":6066},"类里的函数",[10,6068,6069,6070,6073],{},"如果函数是",[818,6071,6072],{},"静态****成员函数"," ，地址在编译期确定，可直接用普通函数指针传递。",[10,6075,6076,6077,6079],{},"如果不是静态成员函数，你就需要用到",[24,6078,5195],{},"了，下面先给你看用函数指针的情况。",[35,6081,6083],{"className":37,"code":6082,"language":39,"meta":40,"style":40},"#include \u003Ciostream>\n\nclass MyClass \n{\npublic:\n    static void staticCallback(int value) \n    {  \n        // 静态成员函数\n        std::cout \u003C\u003C \"Static callback called: \" \u003C\u003C value \u003C\u003C std::endl;\n    }\n};\n\n// 高阶函数接受函数指针参数\nvoid doSomething(void (*callback)(int)) \n{\n    callback(42);  // 触发回调\n}\n\nint main(int argc,char **argv)\n{\n    doSomething(MyClass::staticCallback);\n\n    std::cout \u003C\u003C \"Press Enter to continue...\";\n    std::cin.get(); // 等待用户按下回车键\n    return 0;\n}\n",[24,6084,6085,6091,6095,6103,6107,6111,6131,6136,6141,6163,6167,6171,6175,6180,6202,6206,6220,6224,6228,6250,6254,6266,6270,6282,6294,6302],{"__ignoreMap":40},[44,6086,6087,6089],{"class":46,"line":47},[44,6088,153],{"class":50},[44,6090,932],{"class":81},[44,6092,6093],{"class":46,"line":71},[44,6094,903],{"emptyLinePlaceholder":902},[44,6096,6097,6099,6101],{"class":46,"line":192},[44,6098,2580],{"class":50},[44,6100,2583],{"class":164},[44,6102,2586],{"class":53},[44,6104,6105],{"class":46,"line":198},[44,6106,195],{"class":53},[44,6108,6109],{"class":46,"line":218},[44,6110,3509],{"class":50},[44,6112,6113,6116,6119,6122,6124,6126,6129],{"class":46,"line":230},[44,6114,6115],{"class":50},"    static",[44,6117,6118],{"class":50}," void",[44,6120,6121],{"class":164}," staticCallback",[44,6123,168],{"class":53},[44,6125,161],{"class":50},[44,6127,6128],{"class":173}," value",[44,6130,1697],{"class":53},[44,6132,6133],{"class":46,"line":474},[44,6134,6135],{"class":53},"    {  \n",[44,6137,6138],{"class":46,"line":995},[44,6139,6140],{"class":67},"        // 静态成员函数\n",[44,6142,6143,6146,6148,6150,6153,6155,6157,6159,6161],{"class":46,"line":1000},[44,6144,6145],{"class":164},"        std",[44,6147,1475],{"class":53},[44,6149,1025],{"class":50},[44,6151,6152],{"class":81}," \"Static callback called: \"",[44,6154,1031],{"class":50},[44,6156,355],{"class":53},[44,6158,1025],{"class":50},[44,6160,943],{"class":164},[44,6162,1487],{"class":53},[44,6164,6165],{"class":46,"line":1019},[44,6166,3582],{"class":53},[44,6168,6169],{"class":46,"line":1044},[44,6170,1379],{"class":53},[44,6172,6173],{"class":46,"line":1049},[44,6174,903],{"emptyLinePlaceholder":902},[44,6176,6177],{"class":46,"line":1060},[44,6178,6179],{"class":67},"// 高阶函数接受函数指针参数\n",[44,6181,6182,6184,6187,6189,6191,6193,6196,6198,6200],{"class":46,"line":1065},[44,6183,4446],{"class":50},[44,6185,6186],{"class":164}," doSomething",[44,6188,168],{"class":53},[44,6190,4446],{"class":50},[44,6192,5606],{"class":53},[44,6194,6195],{"class":173},"callback",[44,6197,5612],{"class":53},[44,6199,161],{"class":50},[44,6201,5621],{"class":53},[44,6203,6204],{"class":46,"line":1075},[44,6205,195],{"class":53},[44,6207,6208,6211,6213,6215,6217],{"class":46,"line":1815},[44,6209,6210],{"class":164},"    callback",[44,6212,168],{"class":53},[44,6214,617],{"class":60},[44,6216,620],{"class":53},[44,6218,6219],{"class":67},"  // 触发回调\n",[44,6221,6222],{"class":46,"line":1820},[44,6223,233],{"class":53},[44,6225,6226],{"class":46,"line":1835},[44,6227,903],{"emptyLinePlaceholder":902},[44,6229,6230,6232,6234,6236,6238,6240,6242,6244,6246,6248],{"class":46,"line":1855},[44,6231,161],{"class":50},[44,6233,165],{"class":164},[44,6235,168],{"class":53},[44,6237,161],{"class":50},[44,6239,174],{"class":173},[44,6241,177],{"class":53},[44,6243,180],{"class":50},[44,6245,183],{"class":50},[44,6247,186],{"class":173},[44,6249,189],{"class":53},[44,6251,6252],{"class":46,"line":1879},[44,6253,195],{"class":53},[44,6255,6256,6259,6261,6263],{"class":46,"line":1884},[44,6257,6258],{"class":164},"    doSomething",[44,6260,168],{"class":53},[44,6262,4775],{"class":164},[44,6264,6265],{"class":53},"::staticCallback);\n",[44,6267,6268],{"class":46,"line":1898},[44,6269,903],{"emptyLinePlaceholder":902},[44,6271,6272,6274,6276,6278,6280],{"class":46,"line":1912},[44,6273,201],{"class":164},[44,6275,1475],{"class":53},[44,6277,1025],{"class":50},[44,6279,1893],{"class":81},[44,6281,227],{"class":53},[44,6283,6284,6286,6288,6290,6292],{"class":46,"line":1921},[44,6285,201],{"class":164},[44,6287,1903],{"class":53},[44,6289,1906],{"class":164},[44,6291,2306],{"class":53},[44,6293,2309],{"class":67},[44,6295,6296,6298,6300],{"class":46,"line":2774},[44,6297,221],{"class":50},[44,6299,224],{"class":60},[44,6301,227],{"class":53},[44,6303,6304],{"class":46,"line":2780},[44,6305,233],{"class":53},[5219,6307,6309],{"id":6308},"回调函数callback","回调函数Callback",[10,6311,6312],{},"回调函数其实就是一个要被某个函数当参数传入的函数，但是他往往是因为某个事件发生而被调用的，并非直接被你从main函数里用函数调用。",[10,6314,6315,6318,6319,6321],{},[818,6316,6317],{},"语法层面没有本质区别"," ：都是把函数指针或 ",[24,6320,5195],{}," 作为参数传递。",[10,6323,6324,6327],{},[818,6325,6326],{},"语义和场景不同"," ：",[1103,6329,6330,6333],{},[99,6331,6332],{},"“普通函数当参数” → 是你要去主动调用。",[99,6334,6335,6336,6339,6340,6343,6344,6347],{},"“回调函数” → 是你把函数给别人，别人 ",[818,6337,6338],{},"“事件发生”时再调用你"," 。回调函数就像 ",[818,6341,6342],{},"中断服务函数"," ，你提前设好地址， ",[818,6345,6346],{},"等着被调用"," 。",[1502,6349,6350,6363],{},[1505,6351,6352],{},[1508,6353,6354,6357,6360],{},[1511,6355,6356],{"align":1513},"对比项",[1511,6358,6359],{"align":1513},"普通函数参数",[1511,6361,6362],{"align":1513},"回调函数",[1519,6364,6365,6374,6385,6396,6407],{},[1508,6366,6367,6370,6372],{},[1524,6368,6369],{"align":1513},"💡 本质",[1524,6371,5217],{"align":1513},[1524,6373,5217],{"align":1513},[1508,6375,6376,6379,6382],{},[1524,6377,6378],{"align":1513},"🏷️ 意图",[1524,6380,6381],{"align":1513},"你传的函数是被调用方的一部分，你主动调用它",[1524,6383,6384],{"align":1513},"你传的函数是供别人调用的，你被动等待它被调用（回调）",[1508,6386,6387,6390,6393],{},[1524,6388,6389],{"align":1513},"🧠 主动/被动",[1524,6391,6392],{"align":1513},"主动调用",[1524,6394,6395],{"align":1513},"被动被调用",[1508,6397,6398,6401,6404],{},[1524,6399,6400],{"align":1513},"🔁 场景",[1524,6402,6403],{"align":1513},"自己用来调用",[1524,6405,6406],{"align":1513},"别人帮你调用，比如事件发生、完成通知等",[1508,6408,6409,6412,6415],{},[1524,6410,6411],{"align":1513},"📦 示例",[1524,6413,6414],{"align":1513},"排序函数传入比较器",[1524,6416,6417],{"align":1513},"注册鼠标点击事件处理函数、串口接收回调等",[10,6419,6420,6421,6424,6425,6427],{},"正常的普通函数，我们是直接在main函数直接写",[24,6422,6423],{},"doSomething(function)","，用某个函数直接调用",[24,6426,4942],{},"这个函数。",[35,6429,6431],{"className":37,"code":6430,"language":39,"meta":40,"style":40},"int main()\n{\n   doSomething(function);\n}\n\nvoid function()\n{\n\n}\n",[24,6432,6433,6442,6446,6454,6458,6462,6471,6475,6479],{"__ignoreMap":40},[44,6434,6435,6437,6439],{"class":46,"line":47},[44,6436,161],{"class":50},[44,6438,165],{"class":164},[44,6440,6441],{"class":53},"()\n",[44,6443,6444],{"class":46,"line":71},[44,6445,195],{"class":53},[44,6447,6448,6451],{"class":46,"line":192},[44,6449,6450],{"class":164},"   doSomething",[44,6452,6453],{"class":53},"(function);\n",[44,6455,6456],{"class":46,"line":198},[44,6457,233],{"class":53},[44,6459,6460],{"class":46,"line":218},[44,6461,903],{"emptyLinePlaceholder":902},[44,6463,6464,6466,6469],{"class":46,"line":230},[44,6465,4446],{"class":50},[44,6467,6468],{"class":164}," function",[44,6470,6441],{"class":53},[44,6472,6473],{"class":46,"line":474},[44,6474,195],{"class":53},[44,6476,6477],{"class":46,"line":995},[44,6478,903],{"emptyLinePlaceholder":902},[44,6480,6481],{"class":46,"line":1000},[44,6482,233],{"class":53},[10,6484,6485],{},"但回调函数是需要事件触发的，并不是自己在main里调用的。",[10,6487,6488],{},"以下均是伪代码，不能直接运行，直接举了个例子：",[10,6490,6491,6492,6495],{},"比如说在STM32单片机（控制组常用）中，我们在main函数里并没有直接写",[24,6493,6494],{},"doSomething(TIM_IRQHandler_Callback)","，回调函数是被事件触发被动调用的，而非我们在main函数里主动调用。",[35,6497,6499],{"className":37,"code":6498,"language":39,"meta":40,"style":40},"int main() \n{\n    //注册好这个定时器更新中断，每500ms中断一次（仅仅是初始化了一个定时器，并没有调用timer_callback）\n    TIMER_NVIC_Init(500)；\n    while(1) \n    { \n        干别的事;\n    }\n}\n\n//定时器中断回调函数（早就注册过该函数的地址）\nvoid TIM_IRQHandler_Callback() \n{\n    每过500ms后，该函数被动触发！ // 系统帮你调用\n}\n",[24,6500,6501,6509,6513,6518,6531,6542,6547,6552,6556,6560,6564,6569,6578,6582,6590],{"__ignoreMap":40},[44,6502,6503,6505,6507],{"class":46,"line":47},[44,6504,161],{"class":50},[44,6506,165],{"class":164},[44,6508,1729],{"class":53},[44,6510,6511],{"class":46,"line":71},[44,6512,195],{"class":53},[44,6514,6515],{"class":46,"line":192},[44,6516,6517],{"class":67},"    //注册好这个定时器更新中断，每500ms中断一次（仅仅是初始化了一个定时器，并没有调用timer_callback）\n",[44,6519,6520,6523,6525,6528],{"class":46,"line":198},[44,6521,6522],{"class":164},"    TIMER_NVIC_Init",[44,6524,168],{"class":53},[44,6526,6527],{"class":60},"500",[44,6529,6530],{"class":53},")；\n",[44,6532,6533,6536,6538,6540],{"class":46,"line":218},[44,6534,6535],{"class":50},"    while",[44,6537,168],{"class":53},[44,6539,1366],{"class":60},[44,6541,1697],{"class":53},[44,6543,6544],{"class":46,"line":230},[44,6545,6546],{"class":53},"    { \n",[44,6548,6549],{"class":46,"line":474},[44,6550,6551],{"class":53},"        干别的事;\n",[44,6553,6554],{"class":46,"line":995},[44,6555,3582],{"class":53},[44,6557,6558],{"class":46,"line":1000},[44,6559,233],{"class":53},[44,6561,6562],{"class":46,"line":1019},[44,6563,903],{"emptyLinePlaceholder":902},[44,6565,6566],{"class":46,"line":1044},[44,6567,6568],{"class":67},"//定时器中断回调函数（早就注册过该函数的地址）\n",[44,6570,6571,6573,6576],{"class":46,"line":1049},[44,6572,4446],{"class":50},[44,6574,6575],{"class":164}," TIM_IRQHandler_Callback",[44,6577,1729],{"class":53},[44,6579,6580],{"class":46,"line":1060},[44,6581,195],{"class":53},[44,6583,6584,6587],{"class":46,"line":1065},[44,6585,6586],{"class":53},"    每过500ms后，该函数被动触发！",[44,6588,6589],{"class":67}," // 系统帮你调用\n",[44,6591,6592],{"class":46,"line":1075},[44,6593,233],{"class":53},[10,6595,6596,6597,6495],{},"比如说在ROS2中，我们在main函数里并没有直接写",[24,6598,6599],{},"doSomething(timer_callback)",[35,6601,6603],{"className":37,"code":6602,"language":39,"meta":40,"style":40},"main() \n{\n    //注册一个定时器事件，每500ms触发一次（仅仅是初始化了一个定时器，并没有调用timer_callback）\n    timer_ = node->create_wall_timer(500ms, std::bind(&MyNode::timer_callback, this));\n    rclcpp::spin(node);            // 持续跑\n}\n\nclass MyNode\n{\n    void timer_callback() \n    {\n        每过500ms后，该函数被动触发！ // 系统帮你调用\n    }\n}\n",[24,6604,6605,6612,6616,6621,6664,6680,6684,6688,6695,6699,6709,6713,6720,6724],{"__ignoreMap":40},[44,6606,6607,6610],{"class":46,"line":47},[44,6608,6609],{"class":164},"main",[44,6611,1729],{"class":53},[44,6613,6614],{"class":46,"line":71},[44,6615,195],{"class":53},[44,6617,6618],{"class":46,"line":192},[44,6619,6620],{"class":67},"    //注册一个定时器事件，每500ms触发一次（仅仅是初始化了一个定时器，并没有调用timer_callback）\n",[44,6622,6623,6626,6628,6631,6634,6636,6638,6641,6643,6645,6647,6649,6651,6653,6656,6659,6661],{"class":46,"line":198},[44,6624,6625],{"class":53},"    timer_ ",[44,6627,57],{"class":50},[44,6629,6630],{"class":53}," node->",[44,6632,6633],{"class":164},"create_wall_timer",[44,6635,168],{"class":53},[44,6637,6527],{"class":60},[44,6639,6640],{"class":50},"ms",[44,6642,614],{"class":53},[44,6644,292],{"class":164},[44,6646,204],{"class":53},[44,6648,4388],{"class":164},[44,6650,168],{"class":53},[44,6652,2098],{"class":50},[44,6654,6655],{"class":164},"MyNode",[44,6657,6658],{"class":53},"::timer_callback, ",[44,6660,2126],{"class":60},[44,6662,6663],{"class":53},"));\n",[44,6665,6666,6669,6671,6674,6677],{"class":46,"line":218},[44,6667,6668],{"class":164},"    rclcpp",[44,6670,204],{"class":53},[44,6672,6673],{"class":164},"spin",[44,6675,6676],{"class":53},"(node);",[44,6678,6679],{"class":67},"            // 持续跑\n",[44,6681,6682],{"class":46,"line":230},[44,6683,233],{"class":53},[44,6685,6686],{"class":46,"line":474},[44,6687,903],{"emptyLinePlaceholder":902},[44,6689,6690,6692],{"class":46,"line":995},[44,6691,2580],{"class":50},[44,6693,6694],{"class":164}," MyNode\n",[44,6696,6697],{"class":46,"line":1000},[44,6698,195],{"class":53},[44,6700,6701,6704,6707],{"class":46,"line":1019},[44,6702,6703],{"class":50},"    void",[44,6705,6706],{"class":164}," timer_callback",[44,6708,1729],{"class":53},[44,6710,6711],{"class":46,"line":1044},[44,6712,2239],{"class":53},[44,6714,6715,6718],{"class":46,"line":1049},[44,6716,6717],{"class":53},"        每过500ms后，该函数被动触发！",[44,6719,6589],{"class":67},[44,6721,6722],{"class":46,"line":1060},[44,6723,3582],{"class":53},[44,6725,6726],{"class":46,"line":1065},[44,6727,233],{"class":53},[812,6729,5195],{"id":6730},"stdfunction",[5219,6732,1930],{"id":6733},"定义-2",[10,6735,6736],{},"他的定义式：",[35,6738,6740],{"className":37,"code":6739,"language":39,"meta":40,"style":40},"template \u003Ctypename Signature>\nclass std::function;\n",[24,6741,6742,6759],{"__ignoreMap":40},[44,6743,6744,6747,6750,6753,6756],{"class":46,"line":47},[44,6745,6746],{"class":50},"template",[44,6748,6749],{"class":53}," \u003C",[44,6751,6752],{"class":50},"typename",[44,6754,6755],{"class":164}," Signature",[44,6757,6758],{"class":53},">\n",[44,6760,6761,6763,6765,6767,6769],{"class":46,"line":71},[44,6762,2580],{"class":50},[44,6764,943],{"class":164},[44,6766,204],{"class":53},[44,6768,4942],{"class":164},[44,6770,227],{"class":53},[10,6772,6773,6775],{},[24,6774,5195],{}," 是一个可以存储任何“可调用对象”的类型安全的函数包装器。",[10,6777,6778,6779,6782],{},"你可以把它理解成一个 ",[818,6780,6781],{},"通用函数指针"," ，但它比传统函数指针更强大：",[1103,6784,6785,6791,6794],{},[99,6786,6787,6788,6790],{},"可以存储：普通函数、Lambda 表达式、函数对象（仿函数）、",[24,6789,4344],{}," 的结果等。",[99,6792,6793],{},"支持复制、赋值等操作。",[99,6795,6796],{},"类型安全（模板参数确定函数签名）。",[10,6798,6799,6801,6802,6347],{},[24,6800,5195],{}," 有开销（堆内存分配 + 虚函数机制）， ",[818,6803,6804],{},"比直接用 lambda 慢一点",[10,6806,6807,6808,6347],{},"如果你不需要复杂功能、只在局部使用， ",[818,6809,6810],{},"prefer lambda over std::function",[1502,6812,6813,6823],{},[1505,6814,6815],{},[1508,6816,6817,6819,6821],{},[1511,6818,2843],{"align":1513},[1511,6820,5217],{"align":1513},[1511,6822,5195],{"align":1513},[1519,6824,6825,6834,6843,6853,6863,6874],{},[1508,6826,6827,6830,6832],{},[1524,6828,6829],{"align":1513},"支持普通函数",[1524,6831,2859],{"align":1513},[1524,6833,2859],{"align":1513},[1508,6835,6836,6839,6841],{},[1524,6837,6838],{"align":1513},"支持 Lambda（捕获变量）",[1524,6840,2884],{"align":1513},[1524,6842,2859],{"align":1513},[1508,6844,6845,6848,6851],{},[1524,6846,6847],{"align":1513},"支持类仿函数",[1524,6849,6850],{"align":1513},"❌（不能直接）",[1524,6852,2859],{"align":1513},[1508,6854,6855,6858,6861],{},[1524,6856,6857],{"align":1513},"可复制赋值",[1524,6859,6860],{"align":1513},"✅（但受限）",[1524,6862,2859],{"align":1513},[1508,6864,6865,6868,6871],{},[1524,6866,6867],{"align":1513},"类型安全性",[1524,6869,6870],{"align":1513},"一般",[1524,6872,6873],{"align":1513},"更强",[1508,6875,6876,6879,6882],{},[1524,6877,6878],{"align":1513},"灵活性",[1524,6880,6881],{"align":1513},"低",[1524,6883,6884],{"align":1513},"高",[5219,6886,2136],{"id":6887},"基础用法-2",[35,6889,6891],{"className":37,"code":6890,"language":39,"meta":40,"style":40},"#include \u003Ciostream>\n#include \u003Cfunctional>\n\nint add(int a, int b) \n{\n    return a+b;\n}\n\nclass MyClass \n{\npublic:\n    int multiply(int a, int b) \n    { \n        return a * b; \n    }\n};\n\nint main() \n{   \n    //传入函数\n    std::function\u003Cint(int, int)> func1 = add;  // 把函数包进去\n    std::cout \u003C\u003C func1(3, 4) \u003C\u003C std::endl;     // 调用 7\n\n    //传入Lambda\n    std::function\u003Cint(int, int)> func2 = [](int a, int b) \n    {\n        return a - b;\n    };\n    std::cout \u003C\u003C func2(3, 4) \u003C\u003C std::endl;     // 调用  -1\n\n    //传入类的普通成员变量\n    MyClass obj;\n    std::function\u003Cint(int, int)> func3 = std::bind(&MyClass::multiply, &obj, std::placeholders::_1, std::placeholders::_2);\n    std::cout \u003C\u003C func3(3, 4) \u003C\u003C std::endl;    // 调用  12\n\n    std::cout \u003C\u003C \"Press Enter to continue...\";\n    std::cin.get();\n    return 0;\n}\n\n",[24,6892,6893,6899,6905,6909,6929,6933,6944,6948,6952,6960,6964,6968,6989,6993,7003,7007,7011,7015,7023,7027,7032,7065,7094,7098,7103,7142,7146,7156,7160,7190,7194,7199,7203,7265,7295,7299,7311,7321,7329],{"__ignoreMap":40},[44,6894,6895,6897],{"class":46,"line":47},[44,6896,153],{"class":50},[44,6898,932],{"class":81},[44,6900,6901,6903],{"class":46,"line":71},[44,6902,153],{"class":50},[44,6904,4368],{"class":81},[44,6906,6907],{"class":46,"line":192},[44,6908,903],{"emptyLinePlaceholder":902},[44,6910,6911,6913,6915,6917,6919,6921,6923,6925,6927],{"class":46,"line":198},[44,6912,161],{"class":50},[44,6914,2010],{"class":164},[44,6916,168],{"class":53},[44,6918,161],{"class":50},[44,6920,1965],{"class":173},[44,6922,614],{"class":53},[44,6924,161],{"class":50},[44,6926,1972],{"class":173},[44,6928,1697],{"class":53},[44,6930,6931],{"class":46,"line":218},[44,6932,195],{"class":53},[44,6934,6935,6937,6939,6941],{"class":46,"line":230},[44,6936,221],{"class":50},[44,6938,1965],{"class":53},[44,6940,1992],{"class":50},[44,6942,6943],{"class":53},"b;\n",[44,6945,6946],{"class":46,"line":474},[44,6947,233],{"class":53},[44,6949,6950],{"class":46,"line":995},[44,6951,903],{"emptyLinePlaceholder":902},[44,6953,6954,6956,6958],{"class":46,"line":1000},[44,6955,2580],{"class":50},[44,6957,2583],{"class":164},[44,6959,2586],{"class":53},[44,6961,6962],{"class":46,"line":1019},[44,6963,195],{"class":53},[44,6965,6966],{"class":46,"line":1044},[44,6967,3509],{"class":50},[44,6969,6970,6972,6975,6977,6979,6981,6983,6985,6987],{"class":46,"line":1049},[44,6971,1756],{"class":50},[44,6973,6974],{"class":164}," multiply",[44,6976,168],{"class":53},[44,6978,161],{"class":50},[44,6980,1965],{"class":173},[44,6982,614],{"class":53},[44,6984,161],{"class":50},[44,6986,1972],{"class":173},[44,6988,1697],{"class":53},[44,6990,6991],{"class":46,"line":1060},[44,6992,6546],{"class":53},[44,6994,6995,6997,6999,7001],{"class":46,"line":1065},[44,6996,2244],{"class":50},[44,6998,430],{"class":53},[44,7000,1316],{"class":50},[44,7002,1995],{"class":53},[44,7004,7005],{"class":46,"line":1075},[44,7006,3582],{"class":53},[44,7008,7009],{"class":46,"line":1815},[44,7010,1379],{"class":53},[44,7012,7013],{"class":46,"line":1820},[44,7014,903],{"emptyLinePlaceholder":902},[44,7016,7017,7019,7021],{"class":46,"line":1835},[44,7018,161],{"class":50},[44,7020,165],{"class":164},[44,7022,1729],{"class":53},[44,7024,7025],{"class":46,"line":1855},[44,7026,4517],{"class":53},[44,7028,7029],{"class":46,"line":1879},[44,7030,7031],{"class":67},"    //传入函数\n",[44,7033,7034,7036,7039,7042,7044,7046,7048,7050,7052,7055,7057,7059,7062],{"class":46,"line":1884},[44,7035,201],{"class":164},[44,7037,7038],{"class":53},"::function",[44,7040,7041],{"class":50},"\u003Cint",[44,7043,168],{"class":53},[44,7045,161],{"class":50},[44,7047,614],{"class":53},[44,7049,161],{"class":50},[44,7051,3043],{"class":53},[44,7053,7054],{"class":50},">",[44,7056,4529],{"class":53},[44,7058,57],{"class":50},[44,7060,7061],{"class":53}," add;",[44,7063,7064],{"class":67},"  // 把函数包进去\n",[44,7066,7067,7069,7071,7073,7075,7077,7079,7081,7083,7085,7087,7089,7091],{"class":46,"line":1898},[44,7068,201],{"class":164},[44,7070,1475],{"class":53},[44,7072,1025],{"class":50},[44,7074,4815],{"class":164},[44,7076,168],{"class":53},[44,7078,1376],{"class":60},[44,7080,614],{"class":53},[44,7082,1449],{"class":60},[44,7084,2021],{"class":53},[44,7086,1025],{"class":50},[44,7088,943],{"class":164},[44,7090,2028],{"class":53},[44,7092,7093],{"class":67},"     // 调用 7\n",[44,7095,7096],{"class":46,"line":1912},[44,7097,903],{"emptyLinePlaceholder":902},[44,7099,7100],{"class":46,"line":1921},[44,7101,7102],{"class":67},"    //传入Lambda\n",[44,7104,7105,7107,7109,7111,7113,7115,7117,7119,7121,7123,7126,7128,7130,7132,7134,7136,7138,7140],{"class":46,"line":2774},[44,7106,201],{"class":164},[44,7108,7038],{"class":53},[44,7110,7041],{"class":50},[44,7112,168],{"class":53},[44,7114,161],{"class":50},[44,7116,614],{"class":53},[44,7118,161],{"class":50},[44,7120,3043],{"class":53},[44,7122,7054],{"class":50},[44,7124,7125],{"class":53}," func2 ",[44,7127,57],{"class":50},[44,7129,1960],{"class":53},[44,7131,161],{"class":50},[44,7133,1965],{"class":173},[44,7135,614],{"class":53},[44,7137,161],{"class":50},[44,7139,1972],{"class":173},[44,7141,1697],{"class":53},[44,7143,7144],{"class":46,"line":2780},[44,7145,2239],{"class":53},[44,7147,7148,7150,7152,7154],{"class":46,"line":2791},[44,7149,2244],{"class":50},[44,7151,430],{"class":53},[44,7153,839],{"class":50},[44,7155,2251],{"class":53},[44,7157,7158],{"class":46,"line":2796},[44,7159,2256],{"class":53},[44,7161,7162,7164,7166,7168,7171,7173,7175,7177,7179,7181,7183,7185,7187],{"class":46,"line":2809},[44,7163,201],{"class":164},[44,7165,1475],{"class":53},[44,7167,1025],{"class":50},[44,7169,7170],{"class":164}," func2",[44,7172,168],{"class":53},[44,7174,1376],{"class":60},[44,7176,614],{"class":53},[44,7178,1449],{"class":60},[44,7180,2021],{"class":53},[44,7182,1025],{"class":50},[44,7184,943],{"class":164},[44,7186,2028],{"class":53},[44,7188,7189],{"class":67},"     // 调用  -1\n",[44,7191,7192],{"class":46,"line":2820},[44,7193,903],{"emptyLinePlaceholder":902},[44,7195,7196],{"class":46,"line":2829},[44,7197,7198],{"class":67},"    //传入类的普通成员变量\n",[44,7200,7201],{"class":46,"line":3764},[44,7202,2777],{"class":53},[44,7204,7205,7207,7209,7211,7213,7215,7217,7219,7221,7223,7226,7228,7230,7232,7234,7236,7238,7240,7243,7245,7248,7250,7252,7254,7257,7259,7261,7263],{"class":46,"line":3777},[44,7206,201],{"class":164},[44,7208,7038],{"class":53},[44,7210,7041],{"class":50},[44,7212,168],{"class":53},[44,7214,161],{"class":50},[44,7216,614],{"class":53},[44,7218,161],{"class":50},[44,7220,3043],{"class":53},[44,7222,7054],{"class":50},[44,7224,7225],{"class":53}," func3 ",[44,7227,57],{"class":50},[44,7229,943],{"class":164},[44,7231,204],{"class":53},[44,7233,4388],{"class":164},[44,7235,168],{"class":53},[44,7237,2098],{"class":50},[44,7239,4775],{"class":164},[44,7241,7242],{"class":53},"::multiply, ",[44,7244,2098],{"class":50},[44,7246,7247],{"class":53},"obj, ",[44,7249,292],{"class":164},[44,7251,204],{"class":53},[44,7253,4552],{"class":164},[44,7255,7256],{"class":53},"::_1, ",[44,7258,292],{"class":164},[44,7260,204],{"class":53},[44,7262,4552],{"class":164},[44,7264,4564],{"class":53},[44,7266,7267,7269,7271,7273,7276,7278,7280,7282,7284,7286,7288,7290,7292],{"class":46,"line":3788},[44,7268,201],{"class":164},[44,7270,1475],{"class":53},[44,7272,1025],{"class":50},[44,7274,7275],{"class":164}," func3",[44,7277,168],{"class":53},[44,7279,1376],{"class":60},[44,7281,614],{"class":53},[44,7283,1449],{"class":60},[44,7285,2021],{"class":53},[44,7287,1025],{"class":50},[44,7289,943],{"class":164},[44,7291,2028],{"class":53},[44,7293,7294],{"class":67},"    // 调用  12\n",[44,7296,7297],{"class":46,"line":3797},[44,7298,903],{"emptyLinePlaceholder":902},[44,7300,7301,7303,7305,7307,7309],{"class":46,"line":4088},[44,7302,201],{"class":164},[44,7304,1475],{"class":53},[44,7306,1025],{"class":50},[44,7308,1893],{"class":81},[44,7310,227],{"class":53},[44,7312,7313,7315,7317,7319],{"class":46,"line":4099},[44,7314,201],{"class":164},[44,7316,1903],{"class":53},[44,7318,1906],{"class":164},[44,7320,1909],{"class":53},[44,7322,7323,7325,7327],{"class":46,"line":4108},[44,7324,221],{"class":50},[44,7326,224],{"class":60},[44,7328,227],{"class":53},[44,7330,7332],{"class":46,"line":7331},39,[44,7333,233],{"class":53},[10,7335,7336],{},[1194,7337],{"alt":40,"src":7338},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/10/05/image18.webp",[17,7340,7341],{"id":7341},"并发编程",[10,7343,7344],{},"多线程在STM32和ROS2中是非常常用的东西，虽然STM32和ROS2中不会直接用到thread这个类，但是理解起来是差不多的，甚至ROS2里有些东西就是二次封装了C++多线程，所以我们这里直接介绍C++11的多线程。",[10,7346,7347],{},"在多线程数据共享中，STM32需要学习FreeRTOS的队列，信号量等等来解决这个问题，而ROS2中所使用的锁和C++11里的锁原理上是同一个东西，所以要重点学习多线程数据共享的部分。",[10,7349,7350],{},"由于现代C++体系太过于庞大，本章只讲非常常用的多线程操作，部分不常用的多线程操作请自学，你也可以把你认为很常用的功能补充在本文。",[10,7352,7353],{},[758,7354,7355],{"href":7355,"rel":7356},"https://www.bilibili.com/video/BV1d841117SH",[762],[812,7358,7359],{"id":7359},"线程",[96,7361,7362],{},[99,7363,7364],{},[818,7365,7366],{},[24,7367,7368],{},"std::thread(Callable &&f, Args &&args...)",[10,7370,7371,7376],{},[818,7372,7373],{},[24,7374,7375],{},"Callable &&f"," 传入一个可调用对象（函数指针、函数对象、lambda 表达式、成员函数指针等）。",[10,7378,7379,7384,7385,7387,7388,7391,7392,7395,7396,784],{},[818,7380,7381],{},[24,7382,7383],{},"Args &&args..."," 传入 ",[24,7386,453],{}," 所需的参数（可变参数模板）。",[24,7389,7390],{},"std::thread"," 会对这些参数进行 ",[818,7393,7394],{},"值传递"," ，并在新线程中执行 ",[24,7397,7398],{},"f(std::forward\u003CArgs>(args)...)",[10,7400,7401],{},"如果线程函数没有入口参数，那么重载函数只需要第一个参数即可。",[10,7403,7404],{},"如果线程函数有入口参数，那么后面要把入口参数也写上。",[96,7406,7407],{"start":71},[99,7408,7409],{},[818,7410,7411],{},[24,7412,7413],{},"join()",[10,7415,7416,7419,7420,6327],{},[818,7417,7418],{},"作用"," ：等待线程执行完成，并回收线程资源。 ",[818,7421,7422],{},"使用规则",[1103,7424,7425,7439],{},[99,7426,7427,7429,7430,7438],{},[24,7428,7413],{}," 只能在 ",[818,7431,7432,7435,7436],{},[24,7433,7434],{},"joinable()"," 为 ",[24,7437,5983],{}," 的线程上调用。",[99,7440,7441,7443,7444,7450,7451,7453,7454,784],{},[24,7442,7413],{}," 之后，线程对象会变成 ",[818,7445,7446,7447],{},"不可 ",[24,7448,7449],{},"joinable"," ，即 ",[24,7452,7434],{}," 返回 ",[24,7455,7456],{},"false",[10,7458,7459,7461,7462,7465,7466,7469],{},[24,7460,7413],{}," 会 ",[818,7463,7464],{},"阻塞主线程"," ，直到 ",[24,7467,7468],{},"task"," 执行完毕。（如果不阻塞主线程（即main函数），主线程将会接着往下执行，如果下面直接就是return 0，主线程会直接结束整个程序，导致程序抛错）",[10,7471,7472,7473,7475,7476,7479,7480,6347],{},"线程执行完后，",[24,7474,7413],{}," 释放线程资源，",[24,7477,7478],{},"t"," 变为 ",[818,7481,7446,7482],{},[24,7483,7449],{},[10,7485,7486],{},"tips:阻塞主线程对于没学过STM32的同学可能比较难理解，实际上可以理解为，如果线程函数没执行完，main函数就一直运行join()，线程函数执行完毕，才会往join()下方的函数执行。",[96,7488,7489],{"start":192},[99,7490,7491],{},[818,7492,7493],{},[24,7494,7434],{},[10,7496,7497,7499,7500,7502,7503,784],{},[818,7498,7418],{}," ：判断当前 ",[24,7501,7390],{}," 是否可以 ",[24,7504,7413],{},[10,7506,7507],{},[818,7508,7509,7453,7511,7513],{},[24,7510,7434],{},[24,7512,5983],{}," 的情况",[1103,7515,7516],{},[99,7517,7518,7519,6347],{},"线程已被创建，并且 ",[818,7520,7521,7522,7524,7525],{},"还没有 ",[24,7523,7413],{}," 或 ",[24,7526,7527],{},"detach()",[10,7529,7530],{},[818,7531,7532,7453,7534,7513],{},[24,7533,7434],{},[24,7535,7456],{},[1103,7537,7538,7543,7549,7554],{},[99,7539,7540,7542],{},[24,7541,7390],{}," 对象默认构造，没有绑定任何线程。",[99,7544,7545,7546,7548],{},"线程已经 ",[24,7547,7413],{}," 过。",[99,7550,7545,7551,7553],{},[24,7552,7527],{}," 过（变为后台线程）。",[99,7555,7556,7557,7560],{},"线程对象被 ",[24,7558,7559],{},"std::move()"," 走了。",[10,7562,7563],{},"下面有例子：",[35,7565,7567],{"className":37,"code":7566,"language":39,"meta":40,"style":40},"#include \u003Ciostream>\n#include \u003Costream>\n#include \u003Cstring>\n#include \u003Cthread>\n\nusing std::cout;\nusing std::cin;\nusing std::endl;\n\nvoid print_task1()\n{\n    cout \u003C\u003C \"Hello Task1!\" \u003C\u003C endl;\n    return;\n}\n\nvoid print_task2(std::string msg)\n{\n    cout \u003C\u003C msg \u003C\u003C endl;\n    return;\n}\n\nint main(int argc,char **argv) \n{\n    std::string a = \"Hello Task2!\";\n\n    std::thread t1(print_task1);\n    std::thread t2(print_task2,a);\n\n    if (t1.joinable()) \n    {\n        t1.join();\n    }\n\n    if (t2.joinable()) \n    {\n        t2.join();\n    }\n\n    return 0;\n}\n",[24,7568,7569,7575,7582,7589,7596,7600,7609,7618,7626,7630,7639,7643,7657,7663,7667,7671,7691,7695,7708,7714,7718,7722,7744,7748,7762,7766,7779,7791,7795,7808,7812,7822,7826,7830,7841,7845,7854,7858,7862,7870],{"__ignoreMap":40},[44,7570,7571,7573],{"class":46,"line":47},[44,7572,153],{"class":50},[44,7574,932],{"class":81},[44,7576,7577,7579],{"class":46,"line":71},[44,7578,153],{"class":50},[44,7580,7581],{"class":81}," \u003Costream>\n",[44,7583,7584,7586],{"class":46,"line":192},[44,7585,153],{"class":50},[44,7587,7588],{"class":81}," \u003Cstring>\n",[44,7590,7591,7593],{"class":46,"line":198},[44,7592,153],{"class":50},[44,7594,7595],{"class":81}," \u003Cthread>\n",[44,7597,7598],{"class":46,"line":218},[44,7599,903],{"emptyLinePlaceholder":902},[44,7601,7602,7604,7606],{"class":46,"line":230},[44,7603,937],{"class":50},[44,7605,943],{"class":164},[44,7607,7608],{"class":53},"::cout;\n",[44,7610,7611,7613,7615],{"class":46,"line":474},[44,7612,937],{"class":50},[44,7614,943],{"class":164},[44,7616,7617],{"class":53},"::cin;\n",[44,7619,7620,7622,7624],{"class":46,"line":995},[44,7621,937],{"class":50},[44,7623,943],{"class":164},[44,7625,1487],{"class":53},[44,7627,7628],{"class":46,"line":1000},[44,7629,903],{"emptyLinePlaceholder":902},[44,7631,7632,7634,7637],{"class":46,"line":1019},[44,7633,4446],{"class":50},[44,7635,7636],{"class":164}," print_task1",[44,7638,6441],{"class":53},[44,7640,7641],{"class":46,"line":1044},[44,7642,195],{"class":53},[44,7644,7645,7648,7650,7653,7655],{"class":46,"line":1049},[44,7646,7647],{"class":53},"    cout ",[44,7649,1025],{"class":50},[44,7651,7652],{"class":81}," \"Hello Task1!\"",[44,7654,1031],{"class":50},[44,7656,1041],{"class":53},[44,7658,7659,7661],{"class":46,"line":1060},[44,7660,221],{"class":50},[44,7662,227],{"class":53},[44,7664,7665],{"class":46,"line":1065},[44,7666,233],{"class":53},[44,7668,7669],{"class":46,"line":1075},[44,7670,903],{"emptyLinePlaceholder":902},[44,7672,7673,7675,7678,7680,7682,7684,7686,7689],{"class":46,"line":1815},[44,7674,4446],{"class":50},[44,7676,7677],{"class":164}," print_task2",[44,7679,168],{"class":53},[44,7681,292],{"class":164},[44,7683,204],{"class":53},[44,7685,3330],{"class":164},[44,7687,7688],{"class":173}," msg",[44,7690,189],{"class":53},[44,7692,7693],{"class":46,"line":1820},[44,7694,195],{"class":53},[44,7696,7697,7699,7701,7704,7706],{"class":46,"line":1835},[44,7698,7647],{"class":53},[44,7700,1025],{"class":50},[44,7702,7703],{"class":53}," msg ",[44,7705,1025],{"class":50},[44,7707,1041],{"class":53},[44,7709,7710,7712],{"class":46,"line":1855},[44,7711,221],{"class":50},[44,7713,227],{"class":53},[44,7715,7716],{"class":46,"line":1879},[44,7717,233],{"class":53},[44,7719,7720],{"class":46,"line":1884},[44,7721,903],{"emptyLinePlaceholder":902},[44,7723,7724,7726,7728,7730,7732,7734,7736,7738,7740,7742],{"class":46,"line":1898},[44,7725,161],{"class":50},[44,7727,165],{"class":164},[44,7729,168],{"class":53},[44,7731,161],{"class":50},[44,7733,174],{"class":173},[44,7735,177],{"class":53},[44,7737,180],{"class":50},[44,7739,183],{"class":50},[44,7741,186],{"class":173},[44,7743,1697],{"class":53},[44,7745,7746],{"class":46,"line":1912},[44,7747,195],{"class":53},[44,7749,7750,7752,7755,7757,7760],{"class":46,"line":1921},[44,7751,201],{"class":164},[44,7753,7754],{"class":53},"::string a ",[44,7756,57],{"class":50},[44,7758,7759],{"class":81}," \"Hello Task2!\"",[44,7761,227],{"class":53},[44,7763,7764],{"class":46,"line":2774},[44,7765,903],{"emptyLinePlaceholder":902},[44,7767,7768,7770,7773,7776],{"class":46,"line":2780},[44,7769,201],{"class":164},[44,7771,7772],{"class":53},"::thread ",[44,7774,7775],{"class":164},"t1",[44,7777,7778],{"class":53},"(print_task1);\n",[44,7780,7781,7783,7785,7788],{"class":46,"line":2791},[44,7782,201],{"class":164},[44,7784,7772],{"class":53},[44,7786,7787],{"class":164},"t2",[44,7789,7790],{"class":53},"(print_task2,a);\n",[44,7792,7793],{"class":46,"line":2796},[44,7794,903],{"emptyLinePlaceholder":902},[44,7796,7797,7800,7803,7805],{"class":46,"line":2809},[44,7798,7799],{"class":50},"    if",[44,7801,7802],{"class":53}," (t1.",[44,7804,7449],{"class":164},[44,7806,7807],{"class":53},"()) \n",[44,7809,7810],{"class":46,"line":2820},[44,7811,2239],{"class":53},[44,7813,7814,7817,7820],{"class":46,"line":2829},[44,7815,7816],{"class":53},"        t1.",[44,7818,7819],{"class":164},"join",[44,7821,1909],{"class":53},[44,7823,7824],{"class":46,"line":3764},[44,7825,3582],{"class":53},[44,7827,7828],{"class":46,"line":3777},[44,7829,903],{"emptyLinePlaceholder":902},[44,7831,7832,7834,7837,7839],{"class":46,"line":3788},[44,7833,7799],{"class":50},[44,7835,7836],{"class":53}," (t2.",[44,7838,7449],{"class":164},[44,7840,7807],{"class":53},[44,7842,7843],{"class":46,"line":3797},[44,7844,2239],{"class":53},[44,7846,7847,7850,7852],{"class":46,"line":4088},[44,7848,7849],{"class":53},"        t2.",[44,7851,7819],{"class":164},[44,7853,1909],{"class":53},[44,7855,7856],{"class":46,"line":4099},[44,7857,3582],{"class":53},[44,7859,7860],{"class":46,"line":4108},[44,7861,903],{"emptyLinePlaceholder":902},[44,7863,7864,7866,7868],{"class":46,"line":7331},[44,7865,221],{"class":50},[44,7867,224],{"class":60},[44,7869,227],{"class":53},[44,7871,7873],{"class":46,"line":7872},40,[44,7874,233],{"class":53},[10,7876,7877],{},[1194,7878],{"alt":40,"src":7879},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/10/05/image19.webp",[96,7881,7882],{"start":198},[99,7883,7884],{},[818,7885,7886],{},[24,7887,7527],{},[10,7889,7890,7892,7893,7896,7897,7900],{},[24,7891,7527],{}," 用于 ",[818,7894,7895],{},"分离线程"," ，让线程 ",[818,7898,7899],{},"独立运行"," ，主线程不会等待它完成。",[1103,7902,7903,7912,7918,7924],{},[99,7904,7905,7908,7909,7911],{},[818,7906,7907],{},"让线程独立运行"," ，不受 ",[24,7910,7390],{}," 对象管理。",[99,7913,7914,7917],{},[818,7915,7916],{},"主线程不再阻塞"," ，可继续执行。",[99,7919,7920,7923],{},[818,7921,7922],{},"线程执行完后，系统会自动回收资源"," （但你无法控制具体何时回收）。",[99,7925,7926,7928,7929,784],{},[24,7927,7527],{}," 之后，线程变得不可 ",[24,7930,7434],{},[1502,7932,7933,7944],{},[1505,7934,7935],{},[1508,7936,7937,7940,7942],{},[1511,7938,7939],{"align":1513},"方法",[1511,7941,7413],{"align":1513},[1511,7943,7527],{"align":1513},[1519,7945,7946,7955,7966,7977,7988],{},[1508,7947,7948,7950,7953],{},[1524,7949,7418],{"align":1513},[1524,7951,7952],{"align":1513},"等待线程完成",[1524,7954,7907],{"align":1513},[1508,7956,7957,7960,7963],{},[1524,7958,7959],{"align":1513},"是否阻塞主线程",[1524,7961,7962],{"align":1513},"是（等待线程完成）",[1524,7964,7965],{"align":1513},"否（主线程继续执行）",[1508,7967,7968,7971,7974],{},[1524,7969,7970],{"align":1513},"线程是否 joinable()",[1524,7972,7973],{"align":1513},"join() 后变 false",[1524,7975,7976],{"align":1513},"detach() 后变 false",[1508,7978,7979,7982,7985],{},[1524,7980,7981],{"align":1513},"适用场景",[1524,7983,7984],{"align":1513},"需要等待线程完成",[1524,7986,7987],{"align":1513},"后台任务，不需要等待",[1508,7989,7990,7993,7996],{},[1524,7991,7992],{"align":1513},"风险",[1524,7994,7995],{"align":1513},"不能多次 join()",[1524,7997,7998],{"align":1513},"可能访问已销毁的变量",[35,8000,8002],{"className":37,"code":8001,"language":39,"meta":40,"style":40},"#include \u003Ciostream>\n#include \u003Costream>\n#include \u003Cstring>\n#include \u003Cthread>\n\nusing std::cout;\nusing std::cin;\nusing std::endl;\n\nvoid print_task1()\n{\n    cout \u003C\u003C \"Hello Task1!\" \u003C\u003C endl;\n    return;\n}\n\nint main(int argc,char **argv) \n{\n    std::thread t1(print_task1);\n\n    if (t1.joinable()) \n    {\n        t1.detach();\n    }\n\n    return 0;\n}\n",[24,8003,8004,8010,8016,8022,8028,8032,8040,8048,8056,8060,8068,8072,8084,8090,8094,8098,8120,8124,8134,8138,8148,8152,8161,8165,8169,8177],{"__ignoreMap":40},[44,8005,8006,8008],{"class":46,"line":47},[44,8007,153],{"class":50},[44,8009,932],{"class":81},[44,8011,8012,8014],{"class":46,"line":71},[44,8013,153],{"class":50},[44,8015,7581],{"class":81},[44,8017,8018,8020],{"class":46,"line":192},[44,8019,153],{"class":50},[44,8021,7588],{"class":81},[44,8023,8024,8026],{"class":46,"line":198},[44,8025,153],{"class":50},[44,8027,7595],{"class":81},[44,8029,8030],{"class":46,"line":218},[44,8031,903],{"emptyLinePlaceholder":902},[44,8033,8034,8036,8038],{"class":46,"line":230},[44,8035,937],{"class":50},[44,8037,943],{"class":164},[44,8039,7608],{"class":53},[44,8041,8042,8044,8046],{"class":46,"line":474},[44,8043,937],{"class":50},[44,8045,943],{"class":164},[44,8047,7617],{"class":53},[44,8049,8050,8052,8054],{"class":46,"line":995},[44,8051,937],{"class":50},[44,8053,943],{"class":164},[44,8055,1487],{"class":53},[44,8057,8058],{"class":46,"line":1000},[44,8059,903],{"emptyLinePlaceholder":902},[44,8061,8062,8064,8066],{"class":46,"line":1019},[44,8063,4446],{"class":50},[44,8065,7636],{"class":164},[44,8067,6441],{"class":53},[44,8069,8070],{"class":46,"line":1044},[44,8071,195],{"class":53},[44,8073,8074,8076,8078,8080,8082],{"class":46,"line":1049},[44,8075,7647],{"class":53},[44,8077,1025],{"class":50},[44,8079,7652],{"class":81},[44,8081,1031],{"class":50},[44,8083,1041],{"class":53},[44,8085,8086,8088],{"class":46,"line":1060},[44,8087,221],{"class":50},[44,8089,227],{"class":53},[44,8091,8092],{"class":46,"line":1065},[44,8093,233],{"class":53},[44,8095,8096],{"class":46,"line":1075},[44,8097,903],{"emptyLinePlaceholder":902},[44,8099,8100,8102,8104,8106,8108,8110,8112,8114,8116,8118],{"class":46,"line":1815},[44,8101,161],{"class":50},[44,8103,165],{"class":164},[44,8105,168],{"class":53},[44,8107,161],{"class":50},[44,8109,174],{"class":173},[44,8111,177],{"class":53},[44,8113,180],{"class":50},[44,8115,183],{"class":50},[44,8117,186],{"class":173},[44,8119,1697],{"class":53},[44,8121,8122],{"class":46,"line":1820},[44,8123,195],{"class":53},[44,8125,8126,8128,8130,8132],{"class":46,"line":1835},[44,8127,201],{"class":164},[44,8129,7772],{"class":53},[44,8131,7775],{"class":164},[44,8133,7778],{"class":53},[44,8135,8136],{"class":46,"line":1855},[44,8137,903],{"emptyLinePlaceholder":902},[44,8139,8140,8142,8144,8146],{"class":46,"line":1879},[44,8141,7799],{"class":50},[44,8143,7802],{"class":53},[44,8145,7449],{"class":164},[44,8147,7807],{"class":53},[44,8149,8150],{"class":46,"line":1884},[44,8151,2239],{"class":53},[44,8153,8154,8156,8159],{"class":46,"line":1898},[44,8155,7816],{"class":53},[44,8157,8158],{"class":164},"detach",[44,8160,1909],{"class":53},[44,8162,8163],{"class":46,"line":1912},[44,8164,3582],{"class":53},[44,8166,8167],{"class":46,"line":1921},[44,8168,903],{"emptyLinePlaceholder":902},[44,8170,8171,8173,8175],{"class":46,"line":2774},[44,8172,221],{"class":50},[44,8174,224],{"class":60},[44,8176,227],{"class":53},[44,8178,8179],{"class":46,"line":2780},[44,8180,233],{"class":53},[10,8182,8183],{},[1194,8184],{"alt":40,"src":8185},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/10/05/image20.webp",[812,8187,8188],{"id":8188},"常见线程问题",[96,8190,8191],{},[99,8192,8193],{},"传递指针",[35,8195,8197],{"className":37,"code":8196,"language":39,"meta":40,"style":40},"#include \u003Ciostream>\n#include \u003Costream>\n#include \u003Cstring>\n#include \u003Cthread>\n\nusing std::cout;\nusing std::cin;\nusing std::endl;\n\nvoid print_task1(int * num)\n{\n    *num += 10;\n    return;\n}\n\nint main(int argc,char **argv) \n{\n    int a = 1;\n\n    std::thread t1(print_task1,&a);\n\n    if (t1.joinable()) \n    {\n        t1.join();\n    }\n    cout \u003C\u003C a \u003C\u003C endl;\n\n    return 0;\n}\n",[24,8198,8199,8205,8211,8217,8223,8227,8235,8243,8251,8255,8272,8276,8291,8297,8301,8305,8327,8331,8343,8347,8363,8367,8377,8381,8389,8393,8405,8409,8417],{"__ignoreMap":40},[44,8200,8201,8203],{"class":46,"line":47},[44,8202,153],{"class":50},[44,8204,932],{"class":81},[44,8206,8207,8209],{"class":46,"line":71},[44,8208,153],{"class":50},[44,8210,7581],{"class":81},[44,8212,8213,8215],{"class":46,"line":192},[44,8214,153],{"class":50},[44,8216,7588],{"class":81},[44,8218,8219,8221],{"class":46,"line":198},[44,8220,153],{"class":50},[44,8222,7595],{"class":81},[44,8224,8225],{"class":46,"line":218},[44,8226,903],{"emptyLinePlaceholder":902},[44,8228,8229,8231,8233],{"class":46,"line":230},[44,8230,937],{"class":50},[44,8232,943],{"class":164},[44,8234,7608],{"class":53},[44,8236,8237,8239,8241],{"class":46,"line":474},[44,8238,937],{"class":50},[44,8240,943],{"class":164},[44,8242,7617],{"class":53},[44,8244,8245,8247,8249],{"class":46,"line":995},[44,8246,937],{"class":50},[44,8248,943],{"class":164},[44,8250,1487],{"class":53},[44,8252,8253],{"class":46,"line":1000},[44,8254,903],{"emptyLinePlaceholder":902},[44,8256,8257,8259,8261,8263,8265,8267,8270],{"class":46,"line":1019},[44,8258,4446],{"class":50},[44,8260,7636],{"class":164},[44,8262,168],{"class":53},[44,8264,161],{"class":50},[44,8266,1034],{"class":50},[44,8268,8269],{"class":173}," num",[44,8271,189],{"class":53},[44,8273,8274],{"class":46,"line":1044},[44,8275,195],{"class":53},[44,8277,8278,8281,8284,8287,8289],{"class":46,"line":1049},[44,8279,8280],{"class":50},"    *",[44,8282,8283],{"class":53},"num ",[44,8285,8286],{"class":50},"+=",[44,8288,435],{"class":60},[44,8290,227],{"class":53},[44,8292,8293,8295],{"class":46,"line":1060},[44,8294,221],{"class":50},[44,8296,227],{"class":53},[44,8298,8299],{"class":46,"line":1065},[44,8300,233],{"class":53},[44,8302,8303],{"class":46,"line":1075},[44,8304,903],{"emptyLinePlaceholder":902},[44,8306,8307,8309,8311,8313,8315,8317,8319,8321,8323,8325],{"class":46,"line":1815},[44,8308,161],{"class":50},[44,8310,165],{"class":164},[44,8312,168],{"class":53},[44,8314,161],{"class":50},[44,8316,174],{"class":173},[44,8318,177],{"class":53},[44,8320,180],{"class":50},[44,8322,183],{"class":50},[44,8324,186],{"class":173},[44,8326,1697],{"class":53},[44,8328,8329],{"class":46,"line":1820},[44,8330,195],{"class":53},[44,8332,8333,8335,8337,8339,8341],{"class":46,"line":1835},[44,8334,1756],{"class":50},[44,8336,430],{"class":53},[44,8338,57],{"class":50},[44,8340,2406],{"class":60},[44,8342,227],{"class":53},[44,8344,8345],{"class":46,"line":1855},[44,8346,903],{"emptyLinePlaceholder":902},[44,8348,8349,8351,8353,8355,8358,8360],{"class":46,"line":1879},[44,8350,201],{"class":164},[44,8352,7772],{"class":53},[44,8354,7775],{"class":164},[44,8356,8357],{"class":53},"(print_task1,",[44,8359,2098],{"class":50},[44,8361,8362],{"class":53},"a);\n",[44,8364,8365],{"class":46,"line":1884},[44,8366,903],{"emptyLinePlaceholder":902},[44,8368,8369,8371,8373,8375],{"class":46,"line":1898},[44,8370,7799],{"class":50},[44,8372,7802],{"class":53},[44,8374,7449],{"class":164},[44,8376,7807],{"class":53},[44,8378,8379],{"class":46,"line":1912},[44,8380,2239],{"class":53},[44,8382,8383,8385,8387],{"class":46,"line":1921},[44,8384,7816],{"class":53},[44,8386,7819],{"class":164},[44,8388,1909],{"class":53},[44,8390,8391],{"class":46,"line":2774},[44,8392,3582],{"class":53},[44,8394,8395,8397,8399,8401,8403],{"class":46,"line":2780},[44,8396,7647],{"class":53},[44,8398,1025],{"class":50},[44,8400,430],{"class":53},[44,8402,1025],{"class":50},[44,8404,1041],{"class":53},[44,8406,8407],{"class":46,"line":2791},[44,8408,903],{"emptyLinePlaceholder":902},[44,8410,8411,8413,8415],{"class":46,"line":2796},[44,8412,221],{"class":50},[44,8414,224],{"class":60},[44,8416,227],{"class":53},[44,8418,8419],{"class":46,"line":2809},[44,8420,233],{"class":53},[10,8422,8423],{},[1194,8424],{"alt":40,"src":8425},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/10/05/image21.webp",[96,8427,8428],{"start":71},[99,8429,8430],{},"传递引用",[35,8432,8434],{"className":37,"code":8433,"language":39,"meta":40,"style":40},"#include \u003Cfunctional>\n#include \u003Ciostream>\n#include \u003Costream>\n#include \u003Cstring>\n#include \u003Cthread>\n\nusing std::cout;\nusing std::cin;\nusing std::endl;\n\nvoid print_task1(int & num)\n{\n    num += 10;\n    return;\n}\n\nint main(int argc,char **argv) \n{\n    int a = 1;\n\n    std::thread t1(print_task1,std::ref(a));\n\n    if (t1.joinable()) \n    {\n        t1.join();\n    }\n    cout \u003C\u003C a \u003C\u003C endl;\n\n    return 0;\n}\n",[24,8435,8436,8442,8448,8454,8460,8466,8470,8478,8486,8494,8498,8515,8519,8530,8536,8540,8544,8566,8570,8582,8586,8606,8610,8620,8624,8632,8636,8648,8652,8660],{"__ignoreMap":40},[44,8437,8438,8440],{"class":46,"line":47},[44,8439,153],{"class":50},[44,8441,4368],{"class":81},[44,8443,8444,8446],{"class":46,"line":71},[44,8445,153],{"class":50},[44,8447,932],{"class":81},[44,8449,8450,8452],{"class":46,"line":192},[44,8451,153],{"class":50},[44,8453,7581],{"class":81},[44,8455,8456,8458],{"class":46,"line":198},[44,8457,153],{"class":50},[44,8459,7588],{"class":81},[44,8461,8462,8464],{"class":46,"line":218},[44,8463,153],{"class":50},[44,8465,7595],{"class":81},[44,8467,8468],{"class":46,"line":230},[44,8469,903],{"emptyLinePlaceholder":902},[44,8471,8472,8474,8476],{"class":46,"line":474},[44,8473,937],{"class":50},[44,8475,943],{"class":164},[44,8477,7608],{"class":53},[44,8479,8480,8482,8484],{"class":46,"line":995},[44,8481,937],{"class":50},[44,8483,943],{"class":164},[44,8485,7617],{"class":53},[44,8487,8488,8490,8492],{"class":46,"line":1000},[44,8489,937],{"class":50},[44,8491,943],{"class":164},[44,8493,1487],{"class":53},[44,8495,8496],{"class":46,"line":1019},[44,8497,903],{"emptyLinePlaceholder":902},[44,8499,8500,8502,8504,8506,8508,8511,8513],{"class":46,"line":1044},[44,8501,4446],{"class":50},[44,8503,7636],{"class":164},[44,8505,168],{"class":53},[44,8507,161],{"class":50},[44,8509,8510],{"class":50}," &",[44,8512,8269],{"class":173},[44,8514,189],{"class":53},[44,8516,8517],{"class":46,"line":1049},[44,8518,195],{"class":53},[44,8520,8521,8524,8526,8528],{"class":46,"line":1060},[44,8522,8523],{"class":53},"    num ",[44,8525,8286],{"class":50},[44,8527,435],{"class":60},[44,8529,227],{"class":53},[44,8531,8532,8534],{"class":46,"line":1065},[44,8533,221],{"class":50},[44,8535,227],{"class":53},[44,8537,8538],{"class":46,"line":1075},[44,8539,233],{"class":53},[44,8541,8542],{"class":46,"line":1815},[44,8543,903],{"emptyLinePlaceholder":902},[44,8545,8546,8548,8550,8552,8554,8556,8558,8560,8562,8564],{"class":46,"line":1820},[44,8547,161],{"class":50},[44,8549,165],{"class":164},[44,8551,168],{"class":53},[44,8553,161],{"class":50},[44,8555,174],{"class":173},[44,8557,177],{"class":53},[44,8559,180],{"class":50},[44,8561,183],{"class":50},[44,8563,186],{"class":173},[44,8565,1697],{"class":53},[44,8567,8568],{"class":46,"line":1835},[44,8569,195],{"class":53},[44,8571,8572,8574,8576,8578,8580],{"class":46,"line":1855},[44,8573,1756],{"class":50},[44,8575,430],{"class":53},[44,8577,57],{"class":50},[44,8579,2406],{"class":60},[44,8581,227],{"class":53},[44,8583,8584],{"class":46,"line":1879},[44,8585,903],{"emptyLinePlaceholder":902},[44,8587,8588,8590,8592,8594,8596,8598,8600,8603],{"class":46,"line":1884},[44,8589,201],{"class":164},[44,8591,7772],{"class":53},[44,8593,7775],{"class":164},[44,8595,8357],{"class":53},[44,8597,292],{"class":164},[44,8599,204],{"class":53},[44,8601,8602],{"class":164},"ref",[44,8604,8605],{"class":53},"(a));\n",[44,8607,8608],{"class":46,"line":1898},[44,8609,903],{"emptyLinePlaceholder":902},[44,8611,8612,8614,8616,8618],{"class":46,"line":1912},[44,8613,7799],{"class":50},[44,8615,7802],{"class":53},[44,8617,7449],{"class":164},[44,8619,7807],{"class":53},[44,8621,8622],{"class":46,"line":1921},[44,8623,2239],{"class":53},[44,8625,8626,8628,8630],{"class":46,"line":2774},[44,8627,7816],{"class":53},[44,8629,7819],{"class":164},[44,8631,1909],{"class":53},[44,8633,8634],{"class":46,"line":2780},[44,8635,3582],{"class":53},[44,8637,8638,8640,8642,8644,8646],{"class":46,"line":2791},[44,8639,7647],{"class":53},[44,8641,1025],{"class":50},[44,8643,430],{"class":53},[44,8645,1025],{"class":50},[44,8647,1041],{"class":53},[44,8649,8650],{"class":46,"line":2796},[44,8651,903],{"emptyLinePlaceholder":902},[44,8653,8654,8656,8658],{"class":46,"line":2809},[44,8655,221],{"class":50},[44,8657,224],{"class":60},[44,8659,227],{"class":53},[44,8661,8662],{"class":46,"line":2820},[44,8663,233],{"class":53},[10,8665,8666],{},[1194,8667],{"alt":40,"src":8668},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/10/05/image22.webp",[96,8670,8671],{"start":192},[99,8672,8673],{},"私有方法无法访问（用友元函数）",[35,8675,8677],{"className":37,"code":8676,"language":39,"meta":40,"style":40},"#include \u003Cfunctional>\n#include \u003Ciostream>\n#include \u003Costream>\n#include \u003Cstring>\n#include \u003Cthread>\n\nusing std::cout;\nusing std::cin;\nusing std::endl;\n\nclass C\n{\n    private:\n        friend void function1();\n        void print_task1(int & num)\n        {\n            num += 10;\n            return;\n        }\n\n};\n\nvoid function1()\n{\n    int a = 1;\n    C obj;\n\n    std::thread t1(&C::print_task1,&obj,std::ref(a));  //注意默认要传入类对象的地址\n\n    if (t1.joinable()) \n    {\n        t1.join();\n    }\n    cout \u003C\u003C a \u003C\u003C endl;\n}\n\nint main(int argc,char **argv) \n{\n    function1();\n    return 0;\n}\n",[24,8678,8679,8685,8691,8697,8703,8709,8713,8721,8729,8737,8741,8748,8752,8757,8769,8785,8789,8800,8806,8810,8814,8818,8822,8830,8834,8846,8851,8855,8889,8893,8903,8907,8915,8919,8931,8935,8939,8961,8965,8972,8980],{"__ignoreMap":40},[44,8680,8681,8683],{"class":46,"line":47},[44,8682,153],{"class":50},[44,8684,4368],{"class":81},[44,8686,8687,8689],{"class":46,"line":71},[44,8688,153],{"class":50},[44,8690,932],{"class":81},[44,8692,8693,8695],{"class":46,"line":192},[44,8694,153],{"class":50},[44,8696,7581],{"class":81},[44,8698,8699,8701],{"class":46,"line":198},[44,8700,153],{"class":50},[44,8702,7588],{"class":81},[44,8704,8705,8707],{"class":46,"line":218},[44,8706,153],{"class":50},[44,8708,7595],{"class":81},[44,8710,8711],{"class":46,"line":230},[44,8712,903],{"emptyLinePlaceholder":902},[44,8714,8715,8717,8719],{"class":46,"line":474},[44,8716,937],{"class":50},[44,8718,943],{"class":164},[44,8720,7608],{"class":53},[44,8722,8723,8725,8727],{"class":46,"line":995},[44,8724,937],{"class":50},[44,8726,943],{"class":164},[44,8728,7617],{"class":53},[44,8730,8731,8733,8735],{"class":46,"line":1000},[44,8732,937],{"class":50},[44,8734,943],{"class":164},[44,8736,1487],{"class":53},[44,8738,8739],{"class":46,"line":1019},[44,8740,903],{"emptyLinePlaceholder":902},[44,8742,8743,8745],{"class":46,"line":1044},[44,8744,2580],{"class":50},[44,8746,8747],{"class":164}," C\n",[44,8749,8750],{"class":46,"line":1049},[44,8751,195],{"class":53},[44,8753,8754],{"class":46,"line":1060},[44,8755,8756],{"class":50},"    private:\n",[44,8758,8759,8762,8764,8767],{"class":46,"line":1065},[44,8760,8761],{"class":50},"        friend",[44,8763,6118],{"class":50},[44,8765,8766],{"class":164}," function1",[44,8768,1909],{"class":53},[44,8770,8771,8773,8775,8777,8779,8781,8783],{"class":46,"line":1075},[44,8772,2618],{"class":50},[44,8774,7636],{"class":164},[44,8776,168],{"class":53},[44,8778,161],{"class":50},[44,8780,8510],{"class":50},[44,8782,8269],{"class":173},[44,8784,189],{"class":53},[44,8786,8787],{"class":46,"line":1815},[44,8788,2628],{"class":53},[44,8790,8791,8794,8796,8798],{"class":46,"line":1820},[44,8792,8793],{"class":53},"            num ",[44,8795,8286],{"class":50},[44,8797,435],{"class":60},[44,8799,227],{"class":53},[44,8801,8802,8804],{"class":46,"line":1835},[44,8803,3888],{"class":50},[44,8805,227],{"class":53},[44,8807,8808],{"class":46,"line":1855},[44,8809,2754],{"class":53},[44,8811,8812],{"class":46,"line":1879},[44,8813,903],{"emptyLinePlaceholder":902},[44,8815,8816],{"class":46,"line":1884},[44,8817,1379],{"class":53},[44,8819,8820],{"class":46,"line":1898},[44,8821,903],{"emptyLinePlaceholder":902},[44,8823,8824,8826,8828],{"class":46,"line":1912},[44,8825,4446],{"class":50},[44,8827,8766],{"class":164},[44,8829,6441],{"class":53},[44,8831,8832],{"class":46,"line":1921},[44,8833,195],{"class":53},[44,8835,8836,8838,8840,8842,8844],{"class":46,"line":2774},[44,8837,1756],{"class":50},[44,8839,430],{"class":53},[44,8841,57],{"class":50},[44,8843,2406],{"class":60},[44,8845,227],{"class":53},[44,8847,8848],{"class":46,"line":2780},[44,8849,8850],{"class":53},"    C obj;\n",[44,8852,8853],{"class":46,"line":2791},[44,8854,903],{"emptyLinePlaceholder":902},[44,8856,8857,8859,8861,8863,8865,8867,8870,8873,8875,8877,8879,8881,8883,8886],{"class":46,"line":2796},[44,8858,201],{"class":164},[44,8860,7772],{"class":53},[44,8862,7775],{"class":164},[44,8864,168],{"class":53},[44,8866,2098],{"class":50},[44,8868,8869],{"class":164},"C",[44,8871,8872],{"class":53},"::print_task1,",[44,8874,2098],{"class":50},[44,8876,4783],{"class":53},[44,8878,292],{"class":164},[44,8880,204],{"class":53},[44,8882,8602],{"class":164},[44,8884,8885],{"class":53},"(a));",[44,8887,8888],{"class":67},"  //注意默认要传入类对象的地址\n",[44,8890,8891],{"class":46,"line":2809},[44,8892,903],{"emptyLinePlaceholder":902},[44,8894,8895,8897,8899,8901],{"class":46,"line":2820},[44,8896,7799],{"class":50},[44,8898,7802],{"class":53},[44,8900,7449],{"class":164},[44,8902,7807],{"class":53},[44,8904,8905],{"class":46,"line":2829},[44,8906,2239],{"class":53},[44,8908,8909,8911,8913],{"class":46,"line":3764},[44,8910,7816],{"class":53},[44,8912,7819],{"class":164},[44,8914,1909],{"class":53},[44,8916,8917],{"class":46,"line":3777},[44,8918,3582],{"class":53},[44,8920,8921,8923,8925,8927,8929],{"class":46,"line":3788},[44,8922,7647],{"class":53},[44,8924,1025],{"class":50},[44,8926,430],{"class":53},[44,8928,1025],{"class":50},[44,8930,1041],{"class":53},[44,8932,8933],{"class":46,"line":3797},[44,8934,233],{"class":53},[44,8936,8937],{"class":46,"line":4088},[44,8938,903],{"emptyLinePlaceholder":902},[44,8940,8941,8943,8945,8947,8949,8951,8953,8955,8957,8959],{"class":46,"line":4099},[44,8942,161],{"class":50},[44,8944,165],{"class":164},[44,8946,168],{"class":53},[44,8948,161],{"class":50},[44,8950,174],{"class":173},[44,8952,177],{"class":53},[44,8954,180],{"class":50},[44,8956,183],{"class":50},[44,8958,186],{"class":173},[44,8960,1697],{"class":53},[44,8962,8963],{"class":46,"line":4108},[44,8964,195],{"class":53},[44,8966,8967,8970],{"class":46,"line":7331},[44,8968,8969],{"class":164},"    function1",[44,8971,1909],{"class":53},[44,8973,8974,8976,8978],{"class":46,"line":7872},[44,8975,221],{"class":50},[44,8977,224],{"class":60},[44,8979,227],{"class":53},[44,8981,8983],{"class":46,"line":8982},41,[44,8984,233],{"class":53},[812,8986,8988],{"id":8987},"互斥量解决数据共享问题","互斥量(解决数据共享问题)",[10,8990,8991],{},"对于没学过STM32和FreeRTOS的同学，可能不理解数据共享问题，下面举几个例子你就懂了：",[96,8993,8994,8997,9000,9007],{},[99,8995,8996],{},"多个线程同时对一个变量进行写（会造成问题）",[99,8998,8999],{},"一个线程对一个变量进行写的同时，另一个线程对这个变量进行读（会造成问题）",[99,9001,9002,9003,9006],{},"多个线程同时对一个变量进行读（ ",[818,9004,9005],{},"不会"," 造成问题）",[99,9008,9009],{},"... ...更多情况",[10,9011,9012],{},"执行一下下方的代码：",[35,9014,9016],{"className":37,"code":9015,"language":39,"meta":40,"style":40},"#include \u003Ccstdint>\n#include \u003Cfunctional>\n#include \u003Ciostream>\n#include \u003Costream>\n#include \u003Cstring>\n#include \u003Cthread>\n\nusing std::cout;\nusing std::cin;\nusing std::endl;\n\nint a = 1;  // 共享变量\n\nvoid print_task1(int & num)\n{\n    for (short i = 0; i \u003C 1000; i++)\n    {\n        int temp = num;  // 读取 a 的值\n        temp++;           // 增加 1\n        num = temp;       // 写回 a 的值\n    }\n    return;\n}\n\nvoid print_task2(int & num)\n{\n    for (short i = 0; i \u003C 1000; i++)\n    {\n        int temp = num;  // 读取 a 的值\n        temp++;           // 增加 1\n        num = temp;       // 写回 a 的值\n    }\n    return;\n}\n\nint main(int argc, char **argv)\n{\n    std::thread t1(print_task1, std::ref(a));\n    std::thread t2(print_task2, std::ref(a));\n\n    if (t1.joinable())\n    {\n        t1.join();\n    }\n\n    if (t2.joinable())\n    {\n        t2.join();\n    }\n\n    cout \u003C\u003C a \u003C\u003C endl;  // 打印 a 的最终值，可能不等于 2001\n\n    return 0;\n}\n\n",[24,9017,9018,9025,9031,9037,9043,9049,9055,9059,9067,9075,9083,9087,9102,9106,9122,9126,9159,9163,9178,9190,9203,9207,9213,9217,9221,9237,9241,9267,9271,9283,9293,9303,9307,9313,9317,9321,9343,9347,9366,9385,9389,9400,9405,9414,9419,9424,9435,9440,9449,9454,9459,9476,9481,9490],{"__ignoreMap":40},[44,9019,9020,9022],{"class":46,"line":47},[44,9021,153],{"class":50},[44,9023,9024],{"class":81}," \u003Ccstdint>\n",[44,9026,9027,9029],{"class":46,"line":71},[44,9028,153],{"class":50},[44,9030,4368],{"class":81},[44,9032,9033,9035],{"class":46,"line":192},[44,9034,153],{"class":50},[44,9036,932],{"class":81},[44,9038,9039,9041],{"class":46,"line":198},[44,9040,153],{"class":50},[44,9042,7581],{"class":81},[44,9044,9045,9047],{"class":46,"line":218},[44,9046,153],{"class":50},[44,9048,7588],{"class":81},[44,9050,9051,9053],{"class":46,"line":230},[44,9052,153],{"class":50},[44,9054,7595],{"class":81},[44,9056,9057],{"class":46,"line":474},[44,9058,903],{"emptyLinePlaceholder":902},[44,9060,9061,9063,9065],{"class":46,"line":995},[44,9062,937],{"class":50},[44,9064,943],{"class":164},[44,9066,7608],{"class":53},[44,9068,9069,9071,9073],{"class":46,"line":1000},[44,9070,937],{"class":50},[44,9072,943],{"class":164},[44,9074,7617],{"class":53},[44,9076,9077,9079,9081],{"class":46,"line":1019},[44,9078,937],{"class":50},[44,9080,943],{"class":164},[44,9082,1487],{"class":53},[44,9084,9085],{"class":46,"line":1044},[44,9086,903],{"emptyLinePlaceholder":902},[44,9088,9089,9091,9093,9095,9097,9099],{"class":46,"line":1049},[44,9090,161],{"class":50},[44,9092,430],{"class":53},[44,9094,57],{"class":50},[44,9096,2406],{"class":60},[44,9098,64],{"class":53},[44,9100,9101],{"class":67},"  // 共享变量\n",[44,9103,9104],{"class":46,"line":1060},[44,9105,903],{"emptyLinePlaceholder":902},[44,9107,9108,9110,9112,9114,9116,9118,9120],{"class":46,"line":1065},[44,9109,4446],{"class":50},[44,9111,7636],{"class":164},[44,9113,168],{"class":53},[44,9115,161],{"class":50},[44,9117,8510],{"class":50},[44,9119,8269],{"class":173},[44,9121,189],{"class":53},[44,9123,9124],{"class":46,"line":1075},[44,9125,195],{"class":53},[44,9127,9128,9131,9133,9136,9139,9141,9143,9146,9148,9151,9154,9157],{"class":46,"line":1815},[44,9129,9130],{"class":50},"    for",[44,9132,1459],{"class":53},[44,9134,9135],{"class":50},"short",[44,9137,9138],{"class":53}," i ",[44,9140,57],{"class":50},[44,9142,224],{"class":60},[44,9144,9145],{"class":53},"; i ",[44,9147,1295],{"class":50},[44,9149,9150],{"class":60}," 1000",[44,9152,9153],{"class":53},"; i",[44,9155,9156],{"class":50},"++",[44,9158,189],{"class":53},[44,9160,9161],{"class":46,"line":1820},[44,9162,2239],{"class":53},[44,9164,9165,9167,9170,9172,9175],{"class":46,"line":1835},[44,9166,2600],{"class":50},[44,9168,9169],{"class":53}," temp ",[44,9171,57],{"class":50},[44,9173,9174],{"class":53}," num;",[44,9176,9177],{"class":67},"  // 读取 a 的值\n",[44,9179,9180,9183,9185,9187],{"class":46,"line":1855},[44,9181,9182],{"class":53},"        temp",[44,9184,9156],{"class":50},[44,9186,64],{"class":53},[44,9188,9189],{"class":67},"           // 增加 1\n",[44,9191,9192,9195,9197,9200],{"class":46,"line":1879},[44,9193,9194],{"class":53},"        num ",[44,9196,57],{"class":50},[44,9198,9199],{"class":53}," temp;",[44,9201,9202],{"class":67},"       // 写回 a 的值\n",[44,9204,9205],{"class":46,"line":1884},[44,9206,3582],{"class":53},[44,9208,9209,9211],{"class":46,"line":1898},[44,9210,221],{"class":50},[44,9212,227],{"class":53},[44,9214,9215],{"class":46,"line":1912},[44,9216,233],{"class":53},[44,9218,9219],{"class":46,"line":1921},[44,9220,903],{"emptyLinePlaceholder":902},[44,9222,9223,9225,9227,9229,9231,9233,9235],{"class":46,"line":2774},[44,9224,4446],{"class":50},[44,9226,7677],{"class":164},[44,9228,168],{"class":53},[44,9230,161],{"class":50},[44,9232,8510],{"class":50},[44,9234,8269],{"class":173},[44,9236,189],{"class":53},[44,9238,9239],{"class":46,"line":2780},[44,9240,195],{"class":53},[44,9242,9243,9245,9247,9249,9251,9253,9255,9257,9259,9261,9263,9265],{"class":46,"line":2791},[44,9244,9130],{"class":50},[44,9246,1459],{"class":53},[44,9248,9135],{"class":50},[44,9250,9138],{"class":53},[44,9252,57],{"class":50},[44,9254,224],{"class":60},[44,9256,9145],{"class":53},[44,9258,1295],{"class":50},[44,9260,9150],{"class":60},[44,9262,9153],{"class":53},[44,9264,9156],{"class":50},[44,9266,189],{"class":53},[44,9268,9269],{"class":46,"line":2796},[44,9270,2239],{"class":53},[44,9272,9273,9275,9277,9279,9281],{"class":46,"line":2809},[44,9274,2600],{"class":50},[44,9276,9169],{"class":53},[44,9278,57],{"class":50},[44,9280,9174],{"class":53},[44,9282,9177],{"class":67},[44,9284,9285,9287,9289,9291],{"class":46,"line":2820},[44,9286,9182],{"class":53},[44,9288,9156],{"class":50},[44,9290,64],{"class":53},[44,9292,9189],{"class":67},[44,9294,9295,9297,9299,9301],{"class":46,"line":2829},[44,9296,9194],{"class":53},[44,9298,57],{"class":50},[44,9300,9199],{"class":53},[44,9302,9202],{"class":67},[44,9304,9305],{"class":46,"line":3764},[44,9306,3582],{"class":53},[44,9308,9309,9311],{"class":46,"line":3777},[44,9310,221],{"class":50},[44,9312,227],{"class":53},[44,9314,9315],{"class":46,"line":3788},[44,9316,233],{"class":53},[44,9318,9319],{"class":46,"line":3797},[44,9320,903],{"emptyLinePlaceholder":902},[44,9322,9323,9325,9327,9329,9331,9333,9335,9337,9339,9341],{"class":46,"line":4088},[44,9324,161],{"class":50},[44,9326,165],{"class":164},[44,9328,168],{"class":53},[44,9330,161],{"class":50},[44,9332,174],{"class":173},[44,9334,614],{"class":53},[44,9336,180],{"class":50},[44,9338,183],{"class":50},[44,9340,186],{"class":173},[44,9342,189],{"class":53},[44,9344,9345],{"class":46,"line":4099},[44,9346,195],{"class":53},[44,9348,9349,9351,9353,9355,9358,9360,9362,9364],{"class":46,"line":4108},[44,9350,201],{"class":164},[44,9352,7772],{"class":53},[44,9354,7775],{"class":164},[44,9356,9357],{"class":53},"(print_task1, ",[44,9359,292],{"class":164},[44,9361,204],{"class":53},[44,9363,8602],{"class":164},[44,9365,8605],{"class":53},[44,9367,9368,9370,9372,9374,9377,9379,9381,9383],{"class":46,"line":7331},[44,9369,201],{"class":164},[44,9371,7772],{"class":53},[44,9373,7787],{"class":164},[44,9375,9376],{"class":53},"(print_task2, ",[44,9378,292],{"class":164},[44,9380,204],{"class":53},[44,9382,8602],{"class":164},[44,9384,8605],{"class":53},[44,9386,9387],{"class":46,"line":7872},[44,9388,903],{"emptyLinePlaceholder":902},[44,9390,9391,9393,9395,9397],{"class":46,"line":8982},[44,9392,7799],{"class":50},[44,9394,7802],{"class":53},[44,9396,7449],{"class":164},[44,9398,9399],{"class":53},"())\n",[44,9401,9403],{"class":46,"line":9402},42,[44,9404,2239],{"class":53},[44,9406,9408,9410,9412],{"class":46,"line":9407},43,[44,9409,7816],{"class":53},[44,9411,7819],{"class":164},[44,9413,1909],{"class":53},[44,9415,9417],{"class":46,"line":9416},44,[44,9418,3582],{"class":53},[44,9420,9422],{"class":46,"line":9421},45,[44,9423,903],{"emptyLinePlaceholder":902},[44,9425,9427,9429,9431,9433],{"class":46,"line":9426},46,[44,9428,7799],{"class":50},[44,9430,7836],{"class":53},[44,9432,7449],{"class":164},[44,9434,9399],{"class":53},[44,9436,9438],{"class":46,"line":9437},47,[44,9439,2239],{"class":53},[44,9441,9443,9445,9447],{"class":46,"line":9442},48,[44,9444,7849],{"class":53},[44,9446,7819],{"class":164},[44,9448,1909],{"class":53},[44,9450,9452],{"class":46,"line":9451},49,[44,9453,3582],{"class":53},[44,9455,9457],{"class":46,"line":9456},50,[44,9458,903],{"emptyLinePlaceholder":902},[44,9460,9462,9464,9466,9468,9470,9473],{"class":46,"line":9461},51,[44,9463,7647],{"class":53},[44,9465,1025],{"class":50},[44,9467,430],{"class":53},[44,9469,1025],{"class":50},[44,9471,9472],{"class":53}," endl;",[44,9474,9475],{"class":67},"  // 打印 a 的最终值，可能不等于 2001\n",[44,9477,9479],{"class":46,"line":9478},52,[44,9480,903],{"emptyLinePlaceholder":902},[44,9482,9484,9486,9488],{"class":46,"line":9483},53,[44,9485,221],{"class":50},[44,9487,224],{"class":60},[44,9489,227],{"class":53},[44,9491,9493],{"class":46,"line":9492},54,[44,9494,233],{"class":53},[10,9496,9497],{},[1194,9498],{"alt":40,"src":9499},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/10/05/image23.webp",[10,9501,9502],{},"会发现有几次结果不为2001，这说明发生了线程竞争。",[10,9504,9505],{},"如何解决呢？",[10,9507,9508],{},"我们可以使用mutex类对任务函数进行加锁，保证每个时刻只有一个线程对任务函数进行操作。这样就可以解决竞争问题。",[96,9510,9511],{},[99,9512,9513],{},[818,9514,9515,9516],{},"手动加锁：****",[24,9517,9518],{},"std::mutex",[10,9520,9521,9523],{},[24,9522,9518],{}," 是 C++11 引入的一个互斥量（mutex）类型，用于在多线程环境中保护共享资源，避免数据竞争（race conditions）。它提供了线程间的同步，确保同一时刻只有一个线程能够访问共享资源。",[96,9525,9526,9534,9542],{},[99,9527,9528,9533],{},[818,9529,9530],{},[24,9531,9532],{},"mtx.lock()"," ：手动加锁操作，锁住互斥量。如果该互斥量已经被其他线程锁住，调用该函数的线程会被阻塞，直到其他线程释放锁。",[99,9535,9536,9541],{},[818,9537,9538],{},[24,9539,9540],{},"mtx.unlock()"," ：手动解锁操作，释放互斥量，允许其他线程获得锁。如果没有线程持有该锁，调用该函数是非法的，程序会崩溃。",[99,9543,9544],{},[818,9545,9546,9547],{},"自动加锁：****",[24,9548,9549],{},"std::lock_guard\u003Cstd::mutex>",[10,9551,9552,9555,9556,9558,9559,9562],{},[24,9553,9554],{},"std::lock_guard"," 是一个模板类，它为 ",[24,9557,9518],{}," 提供了 ",[818,9560,9561],{},"RAII（资源获取即初始化）"," 风格的管理。RAII 是 C++ 中的一种常见技术，意思是资源（如锁、文件句柄等）在对象生命周期开始时获取，在对象生命周期结束时释放。",[10,9564,9565],{},[818,9566,9567,9569],{},[24,9568,9549],{}," 的作用：",[1103,9571,9572,9589,9601],{},[99,9573,9574,6327,9577,9579,9580,9583,9584,1334,9586,9588],{},[818,9575,9576],{},"自动加锁和解锁",[24,9578,9554],{}," 在创建时自动加锁，且在它超出",[818,9581,9582],{},"作用域","时会自动解锁，这样可以避免手动调用 ",[24,9585,9532],{},[24,9587,9540],{}," 时的错误（如忘记解锁导致的死锁）。",[99,9590,9591,9594,9595,9597,9598,9600],{},[818,9592,9593],{},"异常安全"," ：如果在 ",[24,9596,9554],{}," 的作用域内发生异常，",[24,9599,9554],{}," 会确保锁会被正确释放，从而避免死锁的发生。",[99,9602,9603,9605],{},[818,9604,9582],{}," ：这个类对象在哪定义的，他的作用域就在哪个{}里，下面的例程的作用域就是for循环，更建议锁for循环，而不是整个函数（会让多线程更精细）。",[96,9607,9608],{"start":192},[99,9609,9610],{},[818,9611,9612,9613],{},"自动加锁Plus：****",[24,9614,9615],{},"std::unique_lock\u003Cstd::mutex>",[10,9617,9618,9619,9621],{},"它提供了比 ",[24,9620,9549],{}," 更灵活的锁管理机制，适用于那些需要在锁定期间进行复杂操作（如等待条件变量、手动解锁和重新加锁等）的场景。",[10,9623,9624,9625,9628,9629,9631],{},"它和",[24,9626,9627],{},"lock_guard","功能几乎一样，但是可以选择在作用域下用进行更加细致的加锁和解锁。（如果不需要更加精细的加锁和解锁，那么他的用法和",[24,9630,9627],{},"一样）（如果需要更加细致的加锁解锁，请看下方这段代码）",[35,9633,9635],{"className":37,"code":9634,"language":39,"meta":40,"style":40},"void print_task1(int & num) \n{\n    std::unique_lock\u003Cstd::mutex> lock(mtx);  // 自动加锁\n    // 在这里进行一些操作...\n    num += 10;\n    lock.unlock();  // 显式解锁\n    // 做其他不需要锁的事情...\n\n    lock.lock();  // 显式重新加锁\n    num += 10;\n    //即将超出作用域，自动解锁\n}\n",[24,9636,9637,9653,9657,9682,9687,9697,9710,9715,9719,9731,9741,9746],{"__ignoreMap":40},[44,9638,9639,9641,9643,9645,9647,9649,9651],{"class":46,"line":47},[44,9640,4446],{"class":50},[44,9642,7636],{"class":164},[44,9644,168],{"class":53},[44,9646,161],{"class":50},[44,9648,8510],{"class":50},[44,9650,8269],{"class":173},[44,9652,1697],{"class":53},[44,9654,9655],{"class":46,"line":71},[44,9656,195],{"class":53},[44,9658,9659,9661,9664,9666,9668,9671,9673,9676,9679],{"class":46,"line":192},[44,9660,201],{"class":164},[44,9662,9663],{"class":53},"::unique_lock",[44,9665,1295],{"class":50},[44,9667,292],{"class":164},[44,9669,9670],{"class":53},"::mutex",[44,9672,7054],{"class":50},[44,9674,9675],{"class":164}," lock",[44,9677,9678],{"class":53},"(mtx);",[44,9680,9681],{"class":67},"  // 自动加锁\n",[44,9683,9684],{"class":46,"line":198},[44,9685,9686],{"class":67},"    // 在这里进行一些操作...\n",[44,9688,9689,9691,9693,9695],{"class":46,"line":218},[44,9690,8523],{"class":53},[44,9692,8286],{"class":50},[44,9694,435],{"class":60},[44,9696,227],{"class":53},[44,9698,9699,9702,9705,9707],{"class":46,"line":230},[44,9700,9701],{"class":53},"    lock.",[44,9703,9704],{"class":164},"unlock",[44,9706,2306],{"class":53},[44,9708,9709],{"class":67},"  // 显式解锁\n",[44,9711,9712],{"class":46,"line":474},[44,9713,9714],{"class":67},"    // 做其他不需要锁的事情...\n",[44,9716,9717],{"class":46,"line":995},[44,9718,903],{"emptyLinePlaceholder":902},[44,9720,9721,9723,9726,9728],{"class":46,"line":1000},[44,9722,9701],{"class":53},[44,9724,9725],{"class":164},"lock",[44,9727,2306],{"class":53},[44,9729,9730],{"class":67},"  // 显式重新加锁\n",[44,9732,9733,9735,9737,9739],{"class":46,"line":1019},[44,9734,8523],{"class":53},[44,9736,8286],{"class":50},[44,9738,435],{"class":60},[44,9740,227],{"class":53},[44,9742,9743],{"class":46,"line":1044},[44,9744,9745],{"class":67},"    //即将超出作用域，自动解锁\n",[44,9747,9748],{"class":46,"line":1049},[44,9749,233],{"class":53},[96,9751,9752],{"start":198},[99,9753,9754],{},"区别：上面这俩区别其实就和new与std::shared_ptr区别一样，就是手动管理和自动管理的区别，当然要用自动管理更好啦！",[10,9756,9757,9758,9760],{},"我们加锁后，就不会出现线程竞争了。一般我们使用功能更加强大的**",[24,9759,9615],{},"****。**",[35,9762,9764],{"className":37,"code":9763,"language":39,"meta":40,"style":40},"#include \u003Ccstdint>\n#include \u003Cfunctional>\n#include \u003Ciostream>\n#include \u003Costream>\n#include \u003Cstring>\n#include \u003Cthread>\n#include \u003Cmutex>  // 引入 mutex\n\nusing std::cout;\nusing std::cin;\nusing std::endl;\n\nint a = 1;  // 共享变量\nstd::mutex mtx;  // 定义 mutex\n\nvoid print_task1(int & num)\n{\n    for (short i = 0; i \u003C 1000; i++)\n    {\n        std::lock_guard\u003Cstd::mutex> lock(mtx);  // 自动加锁解锁,不会出现死锁现象(更推荐)\n        int temp = num;  // 读取 a 的值\n        temp++;           // 增加 1\n        num = temp;       // 写回 a 的值\n    }\n    return;\n}\n\nvoid print_task2(int & num)\n{\n    for (short i = 0; i \u003C 1000; i++)\n    {\n        mtx.lock();      // 手动加锁\n        int temp = num;  // 读取 a 的值\n        temp++;           // 增加 1\n        num = temp;       // 写回 a 的值\n        mtx.unlock();    // 手动解锁,如果不解锁，会造成死锁，导致后面无法访问数据\n    }\n    return;\n}\n\nint main(int argc, char **argv)\n{\n    std::thread t1(print_task1, std::ref(a));\n    std::thread t2(print_task2, std::ref(a));\n\n    if (t1.joinable())\n    {\n        t1.join();\n    }\n\n    if (t2.joinable())\n    {\n        t2.join();\n    }\n\n    cout \u003C\u003C a \u003C\u003C endl;  // 打印 a 的最终值，可能不等于 2001\n\n    return 0;\n}\n\n",[24,9765,9766,9772,9778,9784,9790,9796,9802,9812,9816,9824,9832,9840,9844,9858,9868,9872,9888,9892,9918,9922,9944,9956,9966,9976,9980,9986,9990,9994,10010,10014,10040,10044,10056,10068,10078,10088,10099,10103,10109,10113,10117,10139,10143,10161,10179,10183,10193,10197,10205,10209,10213,10223,10227,10235,10239,10244,10259,10264,10273],{"__ignoreMap":40},[44,9767,9768,9770],{"class":46,"line":47},[44,9769,153],{"class":50},[44,9771,9024],{"class":81},[44,9773,9774,9776],{"class":46,"line":71},[44,9775,153],{"class":50},[44,9777,4368],{"class":81},[44,9779,9780,9782],{"class":46,"line":192},[44,9781,153],{"class":50},[44,9783,932],{"class":81},[44,9785,9786,9788],{"class":46,"line":198},[44,9787,153],{"class":50},[44,9789,7581],{"class":81},[44,9791,9792,9794],{"class":46,"line":218},[44,9793,153],{"class":50},[44,9795,7588],{"class":81},[44,9797,9798,9800],{"class":46,"line":230},[44,9799,153],{"class":50},[44,9801,7595],{"class":81},[44,9803,9804,9806,9809],{"class":46,"line":474},[44,9805,153],{"class":50},[44,9807,9808],{"class":81}," \u003Cmutex>",[44,9810,9811],{"class":67},"  // 引入 mutex\n",[44,9813,9814],{"class":46,"line":995},[44,9815,903],{"emptyLinePlaceholder":902},[44,9817,9818,9820,9822],{"class":46,"line":1000},[44,9819,937],{"class":50},[44,9821,943],{"class":164},[44,9823,7608],{"class":53},[44,9825,9826,9828,9830],{"class":46,"line":1019},[44,9827,937],{"class":50},[44,9829,943],{"class":164},[44,9831,7617],{"class":53},[44,9833,9834,9836,9838],{"class":46,"line":1044},[44,9835,937],{"class":50},[44,9837,943],{"class":164},[44,9839,1487],{"class":53},[44,9841,9842],{"class":46,"line":1049},[44,9843,903],{"emptyLinePlaceholder":902},[44,9845,9846,9848,9850,9852,9854,9856],{"class":46,"line":1060},[44,9847,161],{"class":50},[44,9849,430],{"class":53},[44,9851,57],{"class":50},[44,9853,2406],{"class":60},[44,9855,64],{"class":53},[44,9857,9101],{"class":67},[44,9859,9860,9862,9865],{"class":46,"line":1065},[44,9861,292],{"class":164},[44,9863,9864],{"class":53},"::mutex mtx;",[44,9866,9867],{"class":67},"  // 定义 mutex\n",[44,9869,9870],{"class":46,"line":1075},[44,9871,903],{"emptyLinePlaceholder":902},[44,9873,9874,9876,9878,9880,9882,9884,9886],{"class":46,"line":1815},[44,9875,4446],{"class":50},[44,9877,7636],{"class":164},[44,9879,168],{"class":53},[44,9881,161],{"class":50},[44,9883,8510],{"class":50},[44,9885,8269],{"class":173},[44,9887,189],{"class":53},[44,9889,9890],{"class":46,"line":1820},[44,9891,195],{"class":53},[44,9893,9894,9896,9898,9900,9902,9904,9906,9908,9910,9912,9914,9916],{"class":46,"line":1835},[44,9895,9130],{"class":50},[44,9897,1459],{"class":53},[44,9899,9135],{"class":50},[44,9901,9138],{"class":53},[44,9903,57],{"class":50},[44,9905,224],{"class":60},[44,9907,9145],{"class":53},[44,9909,1295],{"class":50},[44,9911,9150],{"class":60},[44,9913,9153],{"class":53},[44,9915,9156],{"class":50},[44,9917,189],{"class":53},[44,9919,9920],{"class":46,"line":1855},[44,9921,2239],{"class":53},[44,9923,9924,9926,9929,9931,9933,9935,9937,9939,9941],{"class":46,"line":1879},[44,9925,6145],{"class":164},[44,9927,9928],{"class":53},"::lock_guard",[44,9930,1295],{"class":50},[44,9932,292],{"class":164},[44,9934,9670],{"class":53},[44,9936,7054],{"class":50},[44,9938,9675],{"class":164},[44,9940,9678],{"class":53},[44,9942,9943],{"class":67},"  // 自动加锁解锁,不会出现死锁现象(更推荐)\n",[44,9945,9946,9948,9950,9952,9954],{"class":46,"line":1884},[44,9947,2600],{"class":50},[44,9949,9169],{"class":53},[44,9951,57],{"class":50},[44,9953,9174],{"class":53},[44,9955,9177],{"class":67},[44,9957,9958,9960,9962,9964],{"class":46,"line":1898},[44,9959,9182],{"class":53},[44,9961,9156],{"class":50},[44,9963,64],{"class":53},[44,9965,9189],{"class":67},[44,9967,9968,9970,9972,9974],{"class":46,"line":1912},[44,9969,9194],{"class":53},[44,9971,57],{"class":50},[44,9973,9199],{"class":53},[44,9975,9202],{"class":67},[44,9977,9978],{"class":46,"line":1921},[44,9979,3582],{"class":53},[44,9981,9982,9984],{"class":46,"line":2774},[44,9983,221],{"class":50},[44,9985,227],{"class":53},[44,9987,9988],{"class":46,"line":2780},[44,9989,233],{"class":53},[44,9991,9992],{"class":46,"line":2791},[44,9993,903],{"emptyLinePlaceholder":902},[44,9995,9996,9998,10000,10002,10004,10006,10008],{"class":46,"line":2796},[44,9997,4446],{"class":50},[44,9999,7677],{"class":164},[44,10001,168],{"class":53},[44,10003,161],{"class":50},[44,10005,8510],{"class":50},[44,10007,8269],{"class":173},[44,10009,189],{"class":53},[44,10011,10012],{"class":46,"line":2809},[44,10013,195],{"class":53},[44,10015,10016,10018,10020,10022,10024,10026,10028,10030,10032,10034,10036,10038],{"class":46,"line":2820},[44,10017,9130],{"class":50},[44,10019,1459],{"class":53},[44,10021,9135],{"class":50},[44,10023,9138],{"class":53},[44,10025,57],{"class":50},[44,10027,224],{"class":60},[44,10029,9145],{"class":53},[44,10031,1295],{"class":50},[44,10033,9150],{"class":60},[44,10035,9153],{"class":53},[44,10037,9156],{"class":50},[44,10039,189],{"class":53},[44,10041,10042],{"class":46,"line":2829},[44,10043,2239],{"class":53},[44,10045,10046,10049,10051,10053],{"class":46,"line":3764},[44,10047,10048],{"class":53},"        mtx.",[44,10050,9725],{"class":164},[44,10052,2306],{"class":53},[44,10054,10055],{"class":67},"      // 手动加锁\n",[44,10057,10058,10060,10062,10064,10066],{"class":46,"line":3777},[44,10059,2600],{"class":50},[44,10061,9169],{"class":53},[44,10063,57],{"class":50},[44,10065,9174],{"class":53},[44,10067,9177],{"class":67},[44,10069,10070,10072,10074,10076],{"class":46,"line":3788},[44,10071,9182],{"class":53},[44,10073,9156],{"class":50},[44,10075,64],{"class":53},[44,10077,9189],{"class":67},[44,10079,10080,10082,10084,10086],{"class":46,"line":3797},[44,10081,9194],{"class":53},[44,10083,57],{"class":50},[44,10085,9199],{"class":53},[44,10087,9202],{"class":67},[44,10089,10090,10092,10094,10096],{"class":46,"line":4088},[44,10091,10048],{"class":53},[44,10093,9704],{"class":164},[44,10095,2306],{"class":53},[44,10097,10098],{"class":67},"    // 手动解锁,如果不解锁，会造成死锁，导致后面无法访问数据\n",[44,10100,10101],{"class":46,"line":4099},[44,10102,3582],{"class":53},[44,10104,10105,10107],{"class":46,"line":4108},[44,10106,221],{"class":50},[44,10108,227],{"class":53},[44,10110,10111],{"class":46,"line":7331},[44,10112,233],{"class":53},[44,10114,10115],{"class":46,"line":7872},[44,10116,903],{"emptyLinePlaceholder":902},[44,10118,10119,10121,10123,10125,10127,10129,10131,10133,10135,10137],{"class":46,"line":8982},[44,10120,161],{"class":50},[44,10122,165],{"class":164},[44,10124,168],{"class":53},[44,10126,161],{"class":50},[44,10128,174],{"class":173},[44,10130,614],{"class":53},[44,10132,180],{"class":50},[44,10134,183],{"class":50},[44,10136,186],{"class":173},[44,10138,189],{"class":53},[44,10140,10141],{"class":46,"line":9402},[44,10142,195],{"class":53},[44,10144,10145,10147,10149,10151,10153,10155,10157,10159],{"class":46,"line":9407},[44,10146,201],{"class":164},[44,10148,7772],{"class":53},[44,10150,7775],{"class":164},[44,10152,9357],{"class":53},[44,10154,292],{"class":164},[44,10156,204],{"class":53},[44,10158,8602],{"class":164},[44,10160,8605],{"class":53},[44,10162,10163,10165,10167,10169,10171,10173,10175,10177],{"class":46,"line":9416},[44,10164,201],{"class":164},[44,10166,7772],{"class":53},[44,10168,7787],{"class":164},[44,10170,9376],{"class":53},[44,10172,292],{"class":164},[44,10174,204],{"class":53},[44,10176,8602],{"class":164},[44,10178,8605],{"class":53},[44,10180,10181],{"class":46,"line":9421},[44,10182,903],{"emptyLinePlaceholder":902},[44,10184,10185,10187,10189,10191],{"class":46,"line":9426},[44,10186,7799],{"class":50},[44,10188,7802],{"class":53},[44,10190,7449],{"class":164},[44,10192,9399],{"class":53},[44,10194,10195],{"class":46,"line":9437},[44,10196,2239],{"class":53},[44,10198,10199,10201,10203],{"class":46,"line":9442},[44,10200,7816],{"class":53},[44,10202,7819],{"class":164},[44,10204,1909],{"class":53},[44,10206,10207],{"class":46,"line":9451},[44,10208,3582],{"class":53},[44,10210,10211],{"class":46,"line":9456},[44,10212,903],{"emptyLinePlaceholder":902},[44,10214,10215,10217,10219,10221],{"class":46,"line":9461},[44,10216,7799],{"class":50},[44,10218,7836],{"class":53},[44,10220,7449],{"class":164},[44,10222,9399],{"class":53},[44,10224,10225],{"class":46,"line":9478},[44,10226,2239],{"class":53},[44,10228,10229,10231,10233],{"class":46,"line":9483},[44,10230,7849],{"class":53},[44,10232,7819],{"class":164},[44,10234,1909],{"class":53},[44,10236,10237],{"class":46,"line":9492},[44,10238,3582],{"class":53},[44,10240,10242],{"class":46,"line":10241},55,[44,10243,903],{"emptyLinePlaceholder":902},[44,10245,10247,10249,10251,10253,10255,10257],{"class":46,"line":10246},56,[44,10248,7647],{"class":53},[44,10250,1025],{"class":50},[44,10252,430],{"class":53},[44,10254,1025],{"class":50},[44,10256,9472],{"class":53},[44,10258,9475],{"class":67},[44,10260,10262],{"class":46,"line":10261},57,[44,10263,903],{"emptyLinePlaceholder":902},[44,10265,10267,10269,10271],{"class":46,"line":10266},58,[44,10268,221],{"class":50},[44,10270,224],{"class":60},[44,10272,227],{"class":53},[44,10274,10276],{"class":46,"line":10275},59,[44,10277,233],{"class":53},[10,10279,10280],{},[1194,10281],{"alt":40,"src":10282},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/10/05/image24.webp",[10284,10285,10286],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}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 .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":40,"searchDepth":71,"depth":71,"links":10288},[10289,10290,10291,10292,10293,10294,10295,10296,10297,10298,10299,10300],{"id":19,"depth":192,"text":19},{"id":90,"depth":192,"text":91},{"id":752,"depth":192,"text":753},{"id":765,"depth":192,"text":765},{"id":810,"depth":192,"text":810},{"id":1322,"depth":192,"text":1322},{"id":1408,"depth":192,"text":1411},{"id":1494,"depth":192,"text":1495},{"id":1926,"depth":192,"text":1927},{"id":4343,"depth":192,"text":4344},{"id":5189,"depth":192,"text":5189},{"id":7341,"depth":192,"text":7341},10000000,"2023-10-05","2023-10-05-cplusplus-jiao-xue","/wiki/2023-10-05-cplusplus-jiao-xue","Cplusplus教学","md",false,null,{},"/wiki/2023-10-05-cplusplus-jiao-xue/ch10-xian-dai-c",{"title":5,"description":12},"wiki/2023-10-05-Cplusplus教学/ch10-现代C++","YV4WXZxMhPCHH-9WWxOSlQnLKjglGaaWMXI8Jb_eBkk",[10315,10320,10321,10326,10331,10336,10341,10346,10351,10357,10363],{"path":10316,"stem":10317,"title":10318,"date":10302,"chapter":1366,"chapterSort":10319,"docKey":10303,"docRoot":10304,"docTitle":10305,"isWikiDoc":902,"isWikiIndex":10307},"/wiki/2023-10-05-cplusplus-jiao-xue/ch1-qian-yan","wiki/2023-10-05-Cplusplus教学/ch1-前言","前言",1000000,{"path":10310,"stem":10312,"title":5,"date":10302,"chapter":4543,"chapterSort":10301,"docKey":10303,"docRoot":10304,"docTitle":10305,"isWikiDoc":902,"isWikiIndex":10307},{"path":10322,"stem":10323,"title":10324,"date":10302,"chapter":1371,"chapterSort":10325,"docKey":10303,"docRoot":10304,"docTitle":10305,"isWikiDoc":902,"isWikiIndex":10307},"/wiki/2023-10-05-cplusplus-jiao-xue/ch2-cheng-xu-yun-xing-yu-bian-liang-sheng-ming-zhou-qi","wiki/2023-10-05-Cplusplus教学/ch2-程序运行与变量生命周期","程序运行与变量生命周期",2000000,{"path":10327,"stem":10328,"title":10329,"date":10302,"chapter":1376,"chapterSort":10330,"docKey":10303,"docRoot":10304,"docTitle":10305,"isWikiDoc":902,"isWikiIndex":10307},"/wiki/2023-10-05-cplusplus-jiao-xue/ch3-tou-wen-jian","wiki/2023-10-05-Cplusplus教学/ch3-头文件","头文件",3000000,{"path":10332,"stem":10333,"title":10334,"date":10302,"chapter":1449,"chapterSort":10335,"docKey":10303,"docRoot":10304,"docTitle":10305,"isWikiDoc":902,"isWikiIndex":10307},"/wiki/2023-10-05-cplusplus-jiao-xue/ch4-c-yu-yan-he-c-de-i-o","wiki/2023-10-05-Cplusplus教学/ch4-C语言和C++的I_O","C语言 和 C++ 的I/O",4000000,{"path":10337,"stem":10338,"title":10339,"date":10302,"chapter":1871,"chapterSort":10340,"docKey":10303,"docRoot":10304,"docTitle":10305,"isWikiDoc":902,"isWikiIndex":10307},"/wiki/2023-10-05-cplusplus-jiao-xue/ch5-c-ming-ming-kong-jian","wiki/2023-10-05-Cplusplus教学/ch5-C++命名空间","C++命名空间",5000000,{"path":10342,"stem":10343,"title":10344,"date":10302,"chapter":4058,"chapterSort":10345,"docKey":10303,"docRoot":10304,"docTitle":10305,"isWikiDoc":902,"isWikiIndex":10307},"/wiki/2023-10-05-cplusplus-jiao-xue/ch6-lian-he-ti-gong-yong-ti","wiki/2023-10-05-Cplusplus教学/ch6-联合体（共用体）","联合体（共用体）",6000000,{"path":10347,"stem":10348,"title":10349,"date":10302,"chapter":3275,"chapterSort":10350,"docKey":10303,"docRoot":10304,"docTitle":10305,"isWikiDoc":902,"isWikiIndex":10307},"/wiki/2023-10-05-cplusplus-jiao-xue/ch7-typedef","wiki/2023-10-05-Cplusplus教学/ch7-typedef","typedef",7000000,{"path":10352,"stem":10353,"title":10354,"date":10302,"chapter":10355,"chapterSort":10356,"docKey":10303,"docRoot":10304,"docTitle":10305,"isWikiDoc":902,"isWikiIndex":10307},"/wiki/2023-10-05-cplusplus-jiao-xue/ch8-jie-gou-ti","wiki/2023-10-05-Cplusplus教学/ch8-结构体","结构体","8",8000000,{"path":10358,"stem":10359,"title":10360,"date":10302,"chapter":10361,"chapterSort":10362,"docKey":10303,"docRoot":10304,"docTitle":10305,"isWikiDoc":902,"isWikiIndex":10307},"/wiki/2023-10-05-cplusplus-jiao-xue/ch9-shu-ju-de-cun-fang","wiki/2023-10-05-Cplusplus教学/ch9-数据的存放","数据的存放","9",9000000,{"path":10304,"stem":10364,"title":10365,"date":10302,"chapter":10308,"chapterSort":10366,"docKey":10303,"docRoot":10304,"docTitle":10305,"isWikiDoc":902,"isWikiIndex":902},"wiki/2023-10-05-Cplusplus教学/index","C/C++教程",0,1778560331430]