[{"data":1,"prerenderedAt":4577},["ShallowReactive",2],{"wiki-page-\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi":3,"wiki-doc-items-2023-10-05-cplusplus-jiao-xue":4018,"wiki:author-members":4565},{"id":4,"title":5,"authors":6,"body":8,"chapterDepth":33,"chapterOrder":4006,"date":4007,"description":25,"docKey":4008,"docRoot":4009,"docTitle":4010,"extension":4011,"isWikiDoc":270,"isWikiIndex":4012,"meta":4013,"navigation":270,"path":4014,"seo":4015,"stem":4016,"wikiDepth":33,"__hash__":4017},"wiki\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1000-右值引用和移动语义.md","右值引用和移动语义",[7],"董佳辉",{"type":9,"value":10,"toc":3985},"minimark",[11,15,19,117,125,128,184,188,191,194,211,214,337,341,439,442,447,777,783,791,795,1438,1442,1448,1459,1462,1486,1492,1499,1508,1570,1573,1617,1620,1639,1642,1659,1666,1724,1727,1781,1789,1825,1828,1837,1855,1861,1869,1872,1931,1934,1950,1961,1968,1978,1981,2001,2006,2027,2030,2090,2093,2099,2102,2117,2120,2124,2127,2141,2144,2204,2207,2221,2224,2230,2233,2236,2239,2254,2257,2284,2287,2293,2296,2308,2311,2318,2324,2327,2340,2351,2359,2365,2401,2410,2425,2445,2448,2451,2482,2485,2488,2491,2584,2587,2655,2658,2663,2666,2765,2768,2771,2802,2812,2814,2863,2866,2889,2895,2915,2918,2928,2949,2953,3376,3380,3386,3389,3477,3481,3493,3545,3559,3563,3644,3647,3652,3725,3728,3733,3789,3792,3797,3861,3868,3873,3894,3901,3904,3947,3950,3975,3978,3981],[12,13,14],"h2",{"id":14},"本节解决什么问题",[16,17,18],"p",{},"考虑这样的场景：",[20,21,26],"pre",{"className":22,"code":23,"language":24,"meta":25,"style":25},"language-cpp shiki shiki-themes github-light github-dark","std::vector\u003Cint> create_large_vector()\n{\n    std::vector\u003Cint> v(1000000);\n    \u002F\u002F ... 填充数据 ...\n    return v;  \u002F\u002F C++98 中会拷贝整个 vector！（非常慢）\n}\n","cpp","",[27,28,29,61,67,92,99,111],"code",{"__ignoreMap":25},[30,31,34,38,42,45,48,52,55,58],"span",{"class":32,"line":33},"line",1,[30,35,37],{"class":36},"sScJk","std",[30,39,41],{"class":40},"sVt8B","::",[30,43,44],{"class":36},"vector",[30,46,47],{"class":40},"\u003C",[30,49,51],{"class":50},"szBVR","int",[30,53,54],{"class":40},"> ",[30,56,57],{"class":36},"create_large_vector",[30,59,60],{"class":40},"()\n",[30,62,64],{"class":32,"line":63},2,[30,65,66],{"class":40},"{\n",[30,68,70,73,76,79,82,85,89],{"class":32,"line":69},3,[30,71,72],{"class":36},"    std",[30,74,75],{"class":40},"::vector",[30,77,78],{"class":50},"\u003Cint>",[30,80,81],{"class":36}," v",[30,83,84],{"class":40},"(",[30,86,88],{"class":87},"sj4cs","1000000",[30,90,91],{"class":40},");\n",[30,93,95],{"class":32,"line":94},4,[30,96,98],{"class":97},"sJ8bj","    \u002F\u002F ... 填充数据 ...\n",[30,100,102,105,108],{"class":32,"line":101},5,[30,103,104],{"class":50},"    return",[30,106,107],{"class":40}," v;",[30,109,110],{"class":97},"  \u002F\u002F C++98 中会拷贝整个 vector！（非常慢）\n",[30,112,114],{"class":32,"line":113},6,[30,115,116],{"class":40},"}\n",[16,118,119,120,124],{},"在 C++98 中，函数返回大的对象时会发生",[121,122,123],"strong",{},"深拷贝","，性能很差。C++11 引入了移动语义，把\"拷贝别人的数据\"变成\"偷走别人的数据\"，大幅提高性能。",[12,126,127],{"id":127},"这个特性是什么",[129,130,131,146,161,170,176],"ul",{},[132,133,134,137,138,141,142,145],"li",{},[121,135,136],{},"左值","：有名字、可以取地址的对象。如变量 ",[27,139,140],{},"x","、",[27,143,144],{},"arr[0]","。",[132,147,148,151,152,141,155,141,158,145],{},[121,149,150],{},"右值","：临时的、即将销毁的对象。如 ",[27,153,154],{},"42",[27,156,157],{},"x + y",[27,159,160],{},"std::move(x)",[132,162,163,169],{},[121,164,165,166],{},"右值引用 ",[27,167,168],{},"T&&","：绑定到右值的引用。",[132,171,172,175],{},[121,173,174],{},"移动语义","：通过\"偷\"右值的资源而不是拷贝，来避免不必要的深拷贝。",[132,177,178,183],{},[121,179,180],{},[27,181,182],{},"std::move","：将左值转为右值引用，告诉编译器\"这个对象我以后不再用了，你可以偷它的资源\"。",[12,185,187],{"id":186},"c-标准版本","C++ 标准版本",[16,189,190],{},"C++11",[12,192,193],{"id":193},"需要的头文件",[20,195,197],{"className":22,"code":196,"language":24,"meta":25,"style":25},"#include \u003Cutility>  \u002F\u002F for std::move, std::forward\n",[27,198,199],{"__ignoreMap":25},[30,200,201,204,208],{"class":32,"line":33},[30,202,203],{"class":50},"#include",[30,205,207],{"class":206},"sZZnC"," \u003Cutility>",[30,209,210],{"class":97},"  \u002F\u002F for std::move, std::forward\n",[12,212,213],{"id":213},"基本语法",[20,215,217],{"className":22,"code":216,"language":24,"meta":25,"style":25},"int&& rref = 42;           \u002F\u002F 右值引用绑定到临时值\nstd::string&& sr = s1 + s2;  \u002F\u002F 绑定到表达式结果\n\n\u002F\u002F std::move：把左值转为右值\nstd::vector\u003Cint> v1 = {1, 2, 3};\nstd::vector\u003Cint> v2 = std::move(v1);  \u002F\u002F v1 的数据被\"偷\"到 v2，v1 变成空\n",[27,218,219,239,266,272,277,310],{"__ignoreMap":25},[30,220,221,224,227,230,233,236],{"class":32,"line":33},[30,222,223],{"class":50},"int&&",[30,225,226],{"class":40}," rref ",[30,228,229],{"class":50},"=",[30,231,232],{"class":87}," 42",[30,234,235],{"class":40},";",[30,237,238],{"class":97},"           \u002F\u002F 右值引用绑定到临时值\n",[30,240,241,243,246,249,252,254,257,260,263],{"class":32,"line":63},[30,242,37],{"class":36},[30,244,245],{"class":40},"::string",[30,247,248],{"class":50},"&&",[30,250,251],{"class":40}," sr ",[30,253,229],{"class":50},[30,255,256],{"class":40}," s1 ",[30,258,259],{"class":50},"+",[30,261,262],{"class":40}," s2;",[30,264,265],{"class":97},"  \u002F\u002F 绑定到表达式结果\n",[30,267,268],{"class":32,"line":69},[30,269,271],{"emptyLinePlaceholder":270},true,"\n",[30,273,274],{"class":32,"line":94},[30,275,276],{"class":97},"\u002F\u002F std::move：把左值转为右值\n",[30,278,279,281,283,285,288,290,293,296,299,302,304,307],{"class":32,"line":101},[30,280,37],{"class":36},[30,282,75],{"class":40},[30,284,78],{"class":50},[30,286,287],{"class":40}," v1 ",[30,289,229],{"class":50},[30,291,292],{"class":40}," {",[30,294,295],{"class":87},"1",[30,297,298],{"class":40},", ",[30,300,301],{"class":87},"2",[30,303,298],{"class":40},[30,305,306],{"class":87},"3",[30,308,309],{"class":40},"};\n",[30,311,312,314,316,318,321,323,326,328,331,334],{"class":32,"line":113},[30,313,37],{"class":36},[30,315,75],{"class":40},[30,317,78],{"class":50},[30,319,320],{"class":40}," v2 ",[30,322,229],{"class":50},[30,324,325],{"class":36}," std",[30,327,41],{"class":40},[30,329,330],{"class":36},"move",[30,332,333],{"class":40},"(v1);",[30,335,336],{"class":97},"  \u002F\u002F v1 的数据被\"偷\"到 v2，v1 变成空\n",[12,338,340],{"id":339},"左值-vs-右值速查表","左值 vs 右值速查表",[342,343,344,361],"table",{},[345,346,347],"thead",{},[348,349,350,355,358],"tr",{},[351,352,354],"th",{"align":353},"left","表达式",[351,356,357],{"align":353},"左值\u002F右值",[351,359,360],{"align":353},"说明",[362,363,364,380,391,402,415,427],"tbody",{},[348,365,366,372,377],{},[367,368,369],"td",{"align":353},[27,370,371],{},"int x = 5;",[367,373,374,376],{"align":353},[27,375,140],{}," 是左值",[367,378,379],{"align":353},"有名字，可取地址",[348,381,382,386,388],{},[367,383,384],{"align":353},[27,385,154],{},[367,387,150],{"align":353},[367,389,390],{"align":353},"字面量",[348,392,393,397,399],{},[367,394,395],{"align":353},[27,396,157],{},[367,398,150],{"align":353},[367,400,401],{"align":353},"临时结果",[348,403,404,410,412],{},[367,405,406,409],{"align":353},[27,407,408],{},"f()"," 返回非引用",[367,411,150],{"align":353},[367,413,414],{"align":353},"临时对象",[348,416,417,422,424],{},[367,418,419,421],{"align":353},[27,420,408],{}," 返回引用",[367,423,136],{"align":353},[367,425,426],{"align":353},"引用是别名",[348,428,429,433,436],{},[367,430,431],{"align":353},[27,432,160],{},[367,434,435],{"align":353},"右值（将亡值）",[367,437,438],{"align":353},"强制转为右值引用",[12,440,441],{"id":441},"示例代码",[443,444,446],"h3",{"id":445},"示例-1拷贝-vs-移动为什么需要移动语义","示例 1：拷贝 vs 移动——为什么需要移动语义",[20,448,450],{"className":22,"code":449,"language":24,"meta":25,"style":25},"#include \u003Ciostream>\n#include \u003Cvector>\n\nint main()\n{\n    std::vector\u003Cint> v1 = {1, 2, 3, 4, 5};\n\n    \u002F\u002F 拷贝（两份独立的数据）\n    std::vector\u003Cint> v2 = v1;\n    std::cout \u003C\u003C \"after copy:\\n\";\n    std::cout \u003C\u003C \"  v1 size = \" \u003C\u003C v1.size() \u003C\u003C \"\\n\";  \u002F\u002F 5\n    std::cout \u003C\u003C \"  v2 size = \" \u003C\u003C v2.size() \u003C\u003C \"\\n\";  \u002F\u002F 5\n\n    \u002F\u002F 移动（v1 的数据被\"偷\"到 v3，v1 变成空）\n    std::vector\u003Cint> v3 = std::move(v1);\n    std::cout \u003C\u003C \"after move:\\n\";\n    std::cout \u003C\u003C \"  v1 size = \" \u003C\u003C v1.size() \u003C\u003C \"\\n\";  \u002F\u002F 0\n    std::cout \u003C\u003C \"  v3 size = \" \u003C\u003C v3.size() \u003C\u003C \"\\n\";  \u002F\u002F 5\n\n    return 0;\n}\n",[27,451,452,459,466,470,479,483,519,524,530,546,569,607,640,645,651,674,692,724,757,762,772],{"__ignoreMap":25},[30,453,454,456],{"class":32,"line":33},[30,455,203],{"class":50},[30,457,458],{"class":206}," \u003Ciostream>\n",[30,460,461,463],{"class":32,"line":63},[30,462,203],{"class":50},[30,464,465],{"class":206}," \u003Cvector>\n",[30,467,468],{"class":32,"line":69},[30,469,271],{"emptyLinePlaceholder":270},[30,471,472,474,477],{"class":32,"line":94},[30,473,51],{"class":50},[30,475,476],{"class":36}," main",[30,478,60],{"class":40},[30,480,481],{"class":32,"line":101},[30,482,66],{"class":40},[30,484,485,487,489,491,493,495,497,499,501,503,505,507,509,512,514,517],{"class":32,"line":113},[30,486,72],{"class":36},[30,488,75],{"class":40},[30,490,78],{"class":50},[30,492,287],{"class":40},[30,494,229],{"class":50},[30,496,292],{"class":40},[30,498,295],{"class":87},[30,500,298],{"class":40},[30,502,301],{"class":87},[30,504,298],{"class":40},[30,506,306],{"class":87},[30,508,298],{"class":40},[30,510,511],{"class":87},"4",[30,513,298],{"class":40},[30,515,516],{"class":87},"5",[30,518,309],{"class":40},[30,520,522],{"class":32,"line":521},7,[30,523,271],{"emptyLinePlaceholder":270},[30,525,527],{"class":32,"line":526},8,[30,528,529],{"class":97},"    \u002F\u002F 拷贝（两份独立的数据）\n",[30,531,533,535,537,539,541,543],{"class":32,"line":532},9,[30,534,72],{"class":36},[30,536,75],{"class":40},[30,538,78],{"class":50},[30,540,320],{"class":40},[30,542,229],{"class":50},[30,544,545],{"class":40}," v1;\n",[30,547,549,551,554,557,560,563,566],{"class":32,"line":548},10,[30,550,72],{"class":36},[30,552,553],{"class":40},"::cout ",[30,555,556],{"class":50},"\u003C\u003C",[30,558,559],{"class":206}," \"after copy:",[30,561,562],{"class":87},"\\n",[30,564,565],{"class":206},"\"",[30,567,568],{"class":40},";\n",[30,570,572,574,576,578,581,584,587,590,593,595,598,600,602,604],{"class":32,"line":571},11,[30,573,72],{"class":36},[30,575,553],{"class":40},[30,577,556],{"class":50},[30,579,580],{"class":206}," \"  v1 size = \"",[30,582,583],{"class":50}," \u003C\u003C",[30,585,586],{"class":40}," v1.",[30,588,589],{"class":36},"size",[30,591,592],{"class":40},"() ",[30,594,556],{"class":50},[30,596,597],{"class":206}," \"",[30,599,562],{"class":87},[30,601,565],{"class":206},[30,603,235],{"class":40},[30,605,606],{"class":97},"  \u002F\u002F 5\n",[30,608,610,612,614,616,619,621,624,626,628,630,632,634,636,638],{"class":32,"line":609},12,[30,611,72],{"class":36},[30,613,553],{"class":40},[30,615,556],{"class":50},[30,617,618],{"class":206}," \"  v2 size = \"",[30,620,583],{"class":50},[30,622,623],{"class":40}," v2.",[30,625,589],{"class":36},[30,627,592],{"class":40},[30,629,556],{"class":50},[30,631,597],{"class":206},[30,633,562],{"class":87},[30,635,565],{"class":206},[30,637,235],{"class":40},[30,639,606],{"class":97},[30,641,643],{"class":32,"line":642},13,[30,644,271],{"emptyLinePlaceholder":270},[30,646,648],{"class":32,"line":647},14,[30,649,650],{"class":97},"    \u002F\u002F 移动（v1 的数据被\"偷\"到 v3，v1 变成空）\n",[30,652,654,656,658,660,663,665,667,669,671],{"class":32,"line":653},15,[30,655,72],{"class":36},[30,657,75],{"class":40},[30,659,78],{"class":50},[30,661,662],{"class":40}," v3 ",[30,664,229],{"class":50},[30,666,325],{"class":36},[30,668,41],{"class":40},[30,670,330],{"class":36},[30,672,673],{"class":40},"(v1);\n",[30,675,677,679,681,683,686,688,690],{"class":32,"line":676},16,[30,678,72],{"class":36},[30,680,553],{"class":40},[30,682,556],{"class":50},[30,684,685],{"class":206}," \"after move:",[30,687,562],{"class":87},[30,689,565],{"class":206},[30,691,568],{"class":40},[30,693,695,697,699,701,703,705,707,709,711,713,715,717,719,721],{"class":32,"line":694},17,[30,696,72],{"class":36},[30,698,553],{"class":40},[30,700,556],{"class":50},[30,702,580],{"class":206},[30,704,583],{"class":50},[30,706,586],{"class":40},[30,708,589],{"class":36},[30,710,592],{"class":40},[30,712,556],{"class":50},[30,714,597],{"class":206},[30,716,562],{"class":87},[30,718,565],{"class":206},[30,720,235],{"class":40},[30,722,723],{"class":97},"  \u002F\u002F 0\n",[30,725,727,729,731,733,736,738,741,743,745,747,749,751,753,755],{"class":32,"line":726},18,[30,728,72],{"class":36},[30,730,553],{"class":40},[30,732,556],{"class":50},[30,734,735],{"class":206}," \"  v3 size = \"",[30,737,583],{"class":50},[30,739,740],{"class":40}," v3.",[30,742,589],{"class":36},[30,744,592],{"class":40},[30,746,556],{"class":50},[30,748,597],{"class":206},[30,750,562],{"class":87},[30,752,565],{"class":206},[30,754,235],{"class":40},[30,756,606],{"class":97},[30,758,760],{"class":32,"line":759},19,[30,761,271],{"emptyLinePlaceholder":270},[30,763,765,767,770],{"class":32,"line":764},20,[30,766,104],{"class":50},[30,768,769],{"class":87}," 0",[30,771,568],{"class":40},[30,773,775],{"class":32,"line":774},21,[30,776,116],{"class":40},[16,778,779,782],{},[121,780,781],{},"运行结果","：",[20,784,789],{"className":785,"code":787,"language":788},[786],"language-text","after copy:\n  v1 size = 5\n  v2 size = 5\nafter move:\n  v1 size = 0\n  v3 size = 5\n","text",[27,790,787],{"__ignoreMap":25},[443,792,794],{"id":793},"示例-2在示例-1-基础上自定义类的移动构造函数","示例 2：在示例 1 基础上，自定义类的移动构造函数",[20,796,798],{"className":22,"code":797,"language":24,"meta":25,"style":25},"#include \u003Calgorithm> \u002F\u002F for std::copy\n#include \u003Ciostream>\n#include \u003Cstring>\n#include \u003Cutility>  \u002F\u002F for std::move\n\nclass Buffer\n{\n    int* data;\n    size_t size;\n\npublic:\n    \u002F\u002F 构造函数\n    Buffer(size_t n) : data(new int[n]), size(n)\n    {\n        std::cout \u003C\u003C \"Constructor: allocated \" \u003C\u003C n \u003C\u003C \" ints\\n\";\n    }\n\n    \u002F\u002F 拷贝构造函数（深拷贝）\n    Buffer(const Buffer& other) : data(new int[other.size]), size(other.size)\n    {\n        std::copy(other.data, other.data + size, data);\n        std::cout \u003C\u003C \"Copy constructor: deep copied \" \u003C\u003C size \u003C\u003C \" ints\\n\";\n    }\n\n    \u002F\u002F 移动构造函数（偷数据）\n    Buffer(Buffer&& other) noexcept\n        : data(other.data), size(other.size)\n    {\n        other.data = nullptr;  \u002F\u002F 让原对象安全析构\n        other.size = 0;\n        std::cout \u003C\u003C \"Move constructor: stole \" \u003C\u003C size \u003C\u003C \" ints\\n\";\n    }\n\n    ~Buffer()\n    {\n        delete[] data;\n        std::cout \u003C\u003C \"Destructor\\n\";\n    }\n\n    size_t get_size() const { return size; }\n};\n\nint main()\n{\n    Buffer buf1(1000);\n\n    \u002F\u002F 拷贝：会触发深拷贝\n    Buffer buf2 = buf1;\n    std::cout \u003C\u003C \"buf1 size after copy: \" \u003C\u003C buf1.get_size() \u003C\u003C \"\\n\";\n\n    \u002F\u002F 移动：数据被偷走，没有深拷贝！\n    Buffer buf3 = std::move(buf2);\n    std::cout \u003C\u003C \"buf2 size after move: \" \u003C\u003C buf2.get_size() \u003C\u003C \"\\n\";\n    std::cout \u003C\u003C \"buf3 size after move: \" \u003C\u003C buf3.get_size() \u003C\u003C \"\\n\";\n\n    return 0;\n}\n",[27,799,800,810,816,823,832,836,844,848,856,864,868,873,878,914,919,947,952,956,961,997,1001,1018,1045,1050,1055,1061,1081,1096,1101,1117,1129,1155,1160,1165,1173,1178,1186,1204,1209,1214,1235,1240,1245,1254,1259,1275,1280,1286,1297,1329,1334,1340,1357,1388,1419,1424,1433],{"__ignoreMap":25},[30,801,802,804,807],{"class":32,"line":33},[30,803,203],{"class":50},[30,805,806],{"class":206}," \u003Calgorithm>",[30,808,809],{"class":97}," \u002F\u002F for std::copy\n",[30,811,812,814],{"class":32,"line":63},[30,813,203],{"class":50},[30,815,458],{"class":206},[30,817,818,820],{"class":32,"line":69},[30,819,203],{"class":50},[30,821,822],{"class":206}," \u003Cstring>\n",[30,824,825,827,829],{"class":32,"line":94},[30,826,203],{"class":50},[30,828,207],{"class":206},[30,830,831],{"class":97},"  \u002F\u002F for std::move\n",[30,833,834],{"class":32,"line":101},[30,835,271],{"emptyLinePlaceholder":270},[30,837,838,841],{"class":32,"line":113},[30,839,840],{"class":50},"class",[30,842,843],{"class":36}," Buffer\n",[30,845,846],{"class":32,"line":521},[30,847,66],{"class":40},[30,849,850,853],{"class":32,"line":526},[30,851,852],{"class":50},"    int*",[30,854,855],{"class":40}," data;\n",[30,857,858,861],{"class":32,"line":532},[30,859,860],{"class":50},"    size_t",[30,862,863],{"class":40}," size;\n",[30,865,866],{"class":32,"line":548},[30,867,271],{"emptyLinePlaceholder":270},[30,869,870],{"class":32,"line":571},[30,871,872],{"class":50},"public:\n",[30,874,875],{"class":32,"line":609},[30,876,877],{"class":97},"    \u002F\u002F 构造函数\n",[30,879,880,883,885,888,892,895,898,900,903,906,909,911],{"class":32,"line":642},[30,881,882],{"class":36},"    Buffer",[30,884,84],{"class":40},[30,886,887],{"class":50},"size_t",[30,889,891],{"class":890},"s4XuR"," n",[30,893,894],{"class":40},") : ",[30,896,897],{"class":36},"data",[30,899,84],{"class":40},[30,901,902],{"class":50},"new",[30,904,905],{"class":50}," int",[30,907,908],{"class":40},"[n]), ",[30,910,589],{"class":36},[30,912,913],{"class":40},"(n)\n",[30,915,916],{"class":32,"line":647},[30,917,918],{"class":40},"    {\n",[30,920,921,924,926,928,931,933,936,938,941,943,945],{"class":32,"line":653},[30,922,923],{"class":36},"        std",[30,925,553],{"class":40},[30,927,556],{"class":50},[30,929,930],{"class":206}," \"Constructor: allocated \"",[30,932,583],{"class":50},[30,934,935],{"class":40}," n ",[30,937,556],{"class":50},[30,939,940],{"class":206}," \" ints",[30,942,562],{"class":87},[30,944,565],{"class":206},[30,946,568],{"class":40},[30,948,949],{"class":32,"line":676},[30,950,951],{"class":40},"    }\n",[30,953,954],{"class":32,"line":694},[30,955,271],{"emptyLinePlaceholder":270},[30,957,958],{"class":32,"line":726},[30,959,960],{"class":97},"    \u002F\u002F 拷贝构造函数（深拷贝）\n",[30,962,963,965,967,970,973,976,979,981,983,985,987,989,992,994],{"class":32,"line":759},[30,964,882],{"class":36},[30,966,84],{"class":40},[30,968,969],{"class":50},"const",[30,971,972],{"class":36}," Buffer",[30,974,975],{"class":50},"&",[30,977,978],{"class":890}," other",[30,980,894],{"class":40},[30,982,897],{"class":36},[30,984,84],{"class":40},[30,986,902],{"class":50},[30,988,905],{"class":50},[30,990,991],{"class":40},"[other.size]), ",[30,993,589],{"class":36},[30,995,996],{"class":40},"(other.size)\n",[30,998,999],{"class":32,"line":764},[30,1000,918],{"class":40},[30,1002,1003,1005,1007,1010,1013,1015],{"class":32,"line":774},[30,1004,923],{"class":36},[30,1006,41],{"class":40},[30,1008,1009],{"class":36},"copy",[30,1011,1012],{"class":40},"(other.data, other.data ",[30,1014,259],{"class":50},[30,1016,1017],{"class":40}," size, data);\n",[30,1019,1021,1023,1025,1027,1030,1032,1035,1037,1039,1041,1043],{"class":32,"line":1020},22,[30,1022,923],{"class":36},[30,1024,553],{"class":40},[30,1026,556],{"class":50},[30,1028,1029],{"class":206}," \"Copy constructor: deep copied \"",[30,1031,583],{"class":50},[30,1033,1034],{"class":40}," size ",[30,1036,556],{"class":50},[30,1038,940],{"class":206},[30,1040,562],{"class":87},[30,1042,565],{"class":206},[30,1044,568],{"class":40},[30,1046,1048],{"class":32,"line":1047},23,[30,1049,951],{"class":40},[30,1051,1053],{"class":32,"line":1052},24,[30,1054,271],{"emptyLinePlaceholder":270},[30,1056,1058],{"class":32,"line":1057},25,[30,1059,1060],{"class":97},"    \u002F\u002F 移动构造函数（偷数据）\n",[30,1062,1064,1066,1068,1071,1073,1075,1078],{"class":32,"line":1063},26,[30,1065,882],{"class":36},[30,1067,84],{"class":40},[30,1069,1070],{"class":36},"Buffer",[30,1072,248],{"class":50},[30,1074,978],{"class":890},[30,1076,1077],{"class":40},") ",[30,1079,1080],{"class":50},"noexcept\n",[30,1082,1084,1087,1089,1092,1094],{"class":32,"line":1083},27,[30,1085,1086],{"class":40},"        : ",[30,1088,897],{"class":36},[30,1090,1091],{"class":40},"(other.data), ",[30,1093,589],{"class":36},[30,1095,996],{"class":40},[30,1097,1099],{"class":32,"line":1098},28,[30,1100,918],{"class":40},[30,1102,1104,1107,1109,1112,1114],{"class":32,"line":1103},29,[30,1105,1106],{"class":40},"        other.data ",[30,1108,229],{"class":50},[30,1110,1111],{"class":87}," nullptr",[30,1113,235],{"class":40},[30,1115,1116],{"class":97},"  \u002F\u002F 让原对象安全析构\n",[30,1118,1120,1123,1125,1127],{"class":32,"line":1119},30,[30,1121,1122],{"class":40},"        other.size ",[30,1124,229],{"class":50},[30,1126,769],{"class":87},[30,1128,568],{"class":40},[30,1130,1132,1134,1136,1138,1141,1143,1145,1147,1149,1151,1153],{"class":32,"line":1131},31,[30,1133,923],{"class":36},[30,1135,553],{"class":40},[30,1137,556],{"class":50},[30,1139,1140],{"class":206}," \"Move constructor: stole \"",[30,1142,583],{"class":50},[30,1144,1034],{"class":40},[30,1146,556],{"class":50},[30,1148,940],{"class":206},[30,1150,562],{"class":87},[30,1152,565],{"class":206},[30,1154,568],{"class":40},[30,1156,1158],{"class":32,"line":1157},32,[30,1159,951],{"class":40},[30,1161,1163],{"class":32,"line":1162},33,[30,1164,271],{"emptyLinePlaceholder":270},[30,1166,1168,1171],{"class":32,"line":1167},34,[30,1169,1170],{"class":36},"    ~Buffer",[30,1172,60],{"class":40},[30,1174,1176],{"class":32,"line":1175},35,[30,1177,918],{"class":40},[30,1179,1181,1184],{"class":32,"line":1180},36,[30,1182,1183],{"class":50},"        delete[]",[30,1185,855],{"class":40},[30,1187,1189,1191,1193,1195,1198,1200,1202],{"class":32,"line":1188},37,[30,1190,923],{"class":36},[30,1192,553],{"class":40},[30,1194,556],{"class":50},[30,1196,1197],{"class":206}," \"Destructor",[30,1199,562],{"class":87},[30,1201,565],{"class":206},[30,1203,568],{"class":40},[30,1205,1207],{"class":32,"line":1206},38,[30,1208,951],{"class":40},[30,1210,1212],{"class":32,"line":1211},39,[30,1213,271],{"emptyLinePlaceholder":270},[30,1215,1217,1219,1222,1224,1226,1229,1232],{"class":32,"line":1216},40,[30,1218,860],{"class":50},[30,1220,1221],{"class":36}," get_size",[30,1223,592],{"class":40},[30,1225,969],{"class":50},[30,1227,1228],{"class":40}," { ",[30,1230,1231],{"class":50},"return",[30,1233,1234],{"class":40}," size; }\n",[30,1236,1238],{"class":32,"line":1237},41,[30,1239,309],{"class":40},[30,1241,1243],{"class":32,"line":1242},42,[30,1244,271],{"emptyLinePlaceholder":270},[30,1246,1248,1250,1252],{"class":32,"line":1247},43,[30,1249,51],{"class":50},[30,1251,476],{"class":36},[30,1253,60],{"class":40},[30,1255,1257],{"class":32,"line":1256},44,[30,1258,66],{"class":40},[30,1260,1262,1265,1268,1270,1273],{"class":32,"line":1261},45,[30,1263,1264],{"class":40},"    Buffer ",[30,1266,1267],{"class":36},"buf1",[30,1269,84],{"class":40},[30,1271,1272],{"class":87},"1000",[30,1274,91],{"class":40},[30,1276,1278],{"class":32,"line":1277},46,[30,1279,271],{"emptyLinePlaceholder":270},[30,1281,1283],{"class":32,"line":1282},47,[30,1284,1285],{"class":97},"    \u002F\u002F 拷贝：会触发深拷贝\n",[30,1287,1289,1292,1294],{"class":32,"line":1288},48,[30,1290,1291],{"class":40},"    Buffer buf2 ",[30,1293,229],{"class":50},[30,1295,1296],{"class":40}," buf1;\n",[30,1298,1300,1302,1304,1306,1309,1311,1314,1317,1319,1321,1323,1325,1327],{"class":32,"line":1299},49,[30,1301,72],{"class":36},[30,1303,553],{"class":40},[30,1305,556],{"class":50},[30,1307,1308],{"class":206}," \"buf1 size after copy: \"",[30,1310,583],{"class":50},[30,1312,1313],{"class":40}," buf1.",[30,1315,1316],{"class":36},"get_size",[30,1318,592],{"class":40},[30,1320,556],{"class":50},[30,1322,597],{"class":206},[30,1324,562],{"class":87},[30,1326,565],{"class":206},[30,1328,568],{"class":40},[30,1330,1332],{"class":32,"line":1331},50,[30,1333,271],{"emptyLinePlaceholder":270},[30,1335,1337],{"class":32,"line":1336},51,[30,1338,1339],{"class":97},"    \u002F\u002F 移动：数据被偷走，没有深拷贝！\n",[30,1341,1343,1346,1348,1350,1352,1354],{"class":32,"line":1342},52,[30,1344,1345],{"class":40},"    Buffer buf3 ",[30,1347,229],{"class":50},[30,1349,325],{"class":36},[30,1351,41],{"class":40},[30,1353,330],{"class":36},[30,1355,1356],{"class":40},"(buf2);\n",[30,1358,1360,1362,1364,1366,1369,1371,1374,1376,1378,1380,1382,1384,1386],{"class":32,"line":1359},53,[30,1361,72],{"class":36},[30,1363,553],{"class":40},[30,1365,556],{"class":50},[30,1367,1368],{"class":206}," \"buf2 size after move: \"",[30,1370,583],{"class":50},[30,1372,1373],{"class":40}," buf2.",[30,1375,1316],{"class":36},[30,1377,592],{"class":40},[30,1379,556],{"class":50},[30,1381,597],{"class":206},[30,1383,562],{"class":87},[30,1385,565],{"class":206},[30,1387,568],{"class":40},[30,1389,1391,1393,1395,1397,1400,1402,1405,1407,1409,1411,1413,1415,1417],{"class":32,"line":1390},54,[30,1392,72],{"class":36},[30,1394,553],{"class":40},[30,1396,556],{"class":50},[30,1398,1399],{"class":206}," \"buf3 size after move: \"",[30,1401,583],{"class":50},[30,1403,1404],{"class":40}," buf3.",[30,1406,1316],{"class":36},[30,1408,592],{"class":40},[30,1410,556],{"class":50},[30,1412,597],{"class":206},[30,1414,562],{"class":87},[30,1416,565],{"class":206},[30,1418,568],{"class":40},[30,1420,1422],{"class":32,"line":1421},55,[30,1423,271],{"emptyLinePlaceholder":270},[30,1425,1427,1429,1431],{"class":32,"line":1426},56,[30,1428,104],{"class":50},[30,1430,769],{"class":87},[30,1432,568],{"class":40},[30,1434,1436],{"class":32,"line":1435},57,[30,1437,116],{"class":40},[16,1439,1440,782],{},[121,1441,781],{},[20,1443,1446],{"className":1444,"code":1445,"language":788},[786],"Constructor: allocated 1000 ints\nCopy constructor: deep copied 1000 ints\nbuf1 size after copy: 1000\nMove constructor: stole 1000 ints\nbuf2 size after move: 0\nbuf3 size after move: 1000\nDestructor\nDestructor\nDestructor\n",[27,1447,1445],{"__ignoreMap":25},[1449,1450,1452,1453,141,1456,1458],"h4",{"id":1451},"buffer-示例详解stdcopystdmove-与对象初始化","Buffer 示例详解：",[27,1454,1455],{},"std::copy",[27,1457,182],{}," 与对象初始化",[16,1460,1461],{},"示例 2 中最容易混淆的地方主要有三个：",[1463,1464,1465,1470,1475],"ol",{},[132,1466,1467,1469],{},[27,1468,1455],{}," 到底复制了什么；",[132,1471,1472,1474],{},[27,1473,182],{}," 到底做了什么；",[132,1476,1477,1478,1481,1482,1485],{},"为什么 ",[27,1479,1480],{},"Buffer b = a;"," 和 ",[27,1483,1484],{},"Buffer b(a);"," 都会调用拷贝构造函数。",[16,1487,1488,1489,1491],{},"下面结合 ",[27,1490,1070],{}," 类逐一说明。",[1493,1494,1496,1498],"h5",{"id":1495},"stdcopy真正复制一段元素",[27,1497,1455],{},"：真正复制一段元素",[16,1500,1501,1503,1504,1507],{},[27,1502,1455],{}," 定义在 ",[27,1505,1506],{},"\u003Calgorithm>"," 中，常见形式可以简化写成：",[20,1509,1511],{"className":22,"code":1510,"language":24,"meta":25,"style":25},"template\u003Cclass InputIt, class OutputIt>\nOutputIt std::copy(InputIt first, InputIt last, OutputIt destination);\n",[27,1512,1513,1535],{"__ignoreMap":25},[30,1514,1515,1518,1520,1522,1525,1527,1529,1532],{"class":32,"line":33},[30,1516,1517],{"class":50},"template",[30,1519,47],{"class":40},[30,1521,840],{"class":50},[30,1523,1524],{"class":36}," InputIt",[30,1526,298],{"class":40},[30,1528,840],{"class":50},[30,1530,1531],{"class":36}," OutputIt",[30,1533,1534],{"class":40},">\n",[30,1536,1537,1540,1542,1544,1546,1548,1551,1554,1556,1558,1561,1563,1565,1568],{"class":32,"line":63},[30,1538,1539],{"class":36},"OutputIt",[30,1541,325],{"class":36},[30,1543,41],{"class":40},[30,1545,1009],{"class":36},[30,1547,84],{"class":40},[30,1549,1550],{"class":36},"InputIt",[30,1552,1553],{"class":890}," first",[30,1555,298],{"class":40},[30,1557,1550],{"class":36},[30,1559,1560],{"class":890}," last",[30,1562,298],{"class":40},[30,1564,1539],{"class":36},[30,1566,1567],{"class":890}," destination",[30,1569,91],{"class":40},[16,1571,1572],{},"三个参数的含义如下：",[342,1574,1575,1585],{},[345,1576,1577],{},[348,1578,1579,1582],{},[351,1580,1581],{"align":353},"参数",[351,1583,1584],{"align":353},"含义",[362,1586,1587,1597,1607],{},[348,1588,1589,1594],{},[367,1590,1591],{"align":353},[27,1592,1593],{},"first",[367,1595,1596],{"align":353},"源数据的起始位置",[348,1598,1599,1604],{},[367,1600,1601],{"align":353},[27,1602,1603],{},"last",[367,1605,1606],{"align":353},"源数据的结束位置，但不包含该位置",[348,1608,1609,1614],{},[367,1610,1611],{"align":353},[27,1612,1613],{},"destination",[367,1615,1616],{"align":353},"目标区域的起始位置",[16,1618,1619],{},"示例中的代码是：",[20,1621,1623],{"className":22,"code":1622,"language":24,"meta":25,"style":25},"std::copy(other.data, other.data + size, data);\n",[27,1624,1625],{"__ignoreMap":25},[30,1626,1627,1629,1631,1633,1635,1637],{"class":32,"line":33},[30,1628,37],{"class":36},[30,1630,41],{"class":40},[30,1632,1009],{"class":36},[30,1634,1012],{"class":40},[30,1636,259],{"class":50},[30,1638,1017],{"class":40},[16,1640,1641],{},"可以理解为：",[1643,1644,1645],"blockquote",{},[16,1646,1647,1648,1651,1652,1655,1656,1658],{},"从 ",[27,1649,1650],{},"other.data"," 开始，复制到 ",[27,1653,1654],{},"other.data + size"," 之前为止，并把结果写入 ",[27,1657,897],{}," 指向的内存。",[16,1660,1661,1662,1665],{},"假设 ",[27,1663,1664],{},"size == 3","，它大致等价于：",[20,1667,1669],{"className":22,"code":1668,"language":24,"meta":25,"style":25},"data[0] = other.data[0];\ndata[1] = other.data[1];\ndata[2] = other.data[2];\n",[27,1670,1671,1692,1708],{"__ignoreMap":25},[30,1672,1673,1676,1679,1682,1684,1687,1689],{"class":32,"line":33},[30,1674,1675],{"class":40},"data[",[30,1677,1678],{"class":87},"0",[30,1680,1681],{"class":40},"] ",[30,1683,229],{"class":50},[30,1685,1686],{"class":40}," other.data[",[30,1688,1678],{"class":87},[30,1690,1691],{"class":40},"];\n",[30,1693,1694,1696,1698,1700,1702,1704,1706],{"class":32,"line":63},[30,1695,1675],{"class":40},[30,1697,295],{"class":87},[30,1699,1681],{"class":40},[30,1701,229],{"class":50},[30,1703,1686],{"class":40},[30,1705,295],{"class":87},[30,1707,1691],{"class":40},[30,1709,1710,1712,1714,1716,1718,1720,1722],{"class":32,"line":69},[30,1711,1675],{"class":40},[30,1713,301],{"class":87},[30,1715,1681],{"class":40},[30,1717,229],{"class":50},[30,1719,1686],{"class":40},[30,1721,301],{"class":87},[30,1723,1691],{"class":40},[16,1725,1726],{},"也可以手写成循环：",[20,1728,1730],{"className":22,"code":1729,"language":24,"meta":25,"style":25},"for (size_t i = 0; i \u003C size; ++i)\n{\n    data[i] = other.data[i];\n}\n",[27,1731,1732,1763,1767,1777],{"__ignoreMap":25},[30,1733,1734,1737,1740,1742,1745,1747,1749,1752,1754,1757,1760],{"class":32,"line":33},[30,1735,1736],{"class":50},"for",[30,1738,1739],{"class":40}," (",[30,1741,887],{"class":50},[30,1743,1744],{"class":40}," i ",[30,1746,229],{"class":50},[30,1748,769],{"class":87},[30,1750,1751],{"class":40},"; i ",[30,1753,47],{"class":50},[30,1755,1756],{"class":40}," size; ",[30,1758,1759],{"class":50},"++",[30,1761,1762],{"class":40},"i)\n",[30,1764,1765],{"class":32,"line":63},[30,1766,66],{"class":40},[30,1768,1769,1772,1774],{"class":32,"line":69},[30,1770,1771],{"class":40},"    data[i] ",[30,1773,229],{"class":50},[30,1775,1776],{"class":40}," other.data[i];\n",[30,1778,1779],{"class":32,"line":94},[30,1780,116],{"class":40},[16,1782,1783,1785,1786,1788],{},[27,1784,1455],{}," 的返回值是目标区域复制结束后的下一个位置。这里复制了 ",[27,1787,589],{}," 个元素，因此：",[20,1790,1792],{"className":22,"code":1791,"language":24,"meta":25,"style":25},"int* end = std::copy(other.data, other.data + size, data);\n\n\u002F\u002F 此时 end 等于 data + size\n",[27,1793,1794,1816,1820],{"__ignoreMap":25},[30,1795,1796,1799,1802,1804,1806,1808,1810,1812,1814],{"class":32,"line":33},[30,1797,1798],{"class":50},"int*",[30,1800,1801],{"class":40}," end ",[30,1803,229],{"class":50},[30,1805,325],{"class":36},[30,1807,41],{"class":40},[30,1809,1009],{"class":36},[30,1811,1012],{"class":40},[30,1813,259],{"class":50},[30,1815,1017],{"class":40},[30,1817,1818],{"class":32,"line":63},[30,1819,271],{"emptyLinePlaceholder":270},[30,1821,1822],{"class":32,"line":69},[30,1823,1824],{"class":97},"\u002F\u002F 此时 end 等于 data + size\n",[16,1826,1827],{},"本例不需要继续使用这个位置，所以直接忽略了返回值。",[16,1829,1830,1831,1833,1834,1836],{},"需要注意，",[27,1832,1455],{}," 不会自动为目标区域申请内存。调用它之前，",[27,1835,897],{}," 必须已经指向足够大的有效内存。本例在成员初始化列表中已经完成了申请：",[20,1838,1840],{"className":22,"code":1839,"language":24,"meta":25,"style":25},"data(new int[other.size])\n",[27,1841,1842],{"__ignoreMap":25},[30,1843,1844,1846,1848,1850,1852],{"class":32,"line":33},[30,1845,897],{"class":36},[30,1847,84],{"class":40},[30,1849,902],{"class":50},[30,1851,905],{"class":50},[30,1853,1854],{"class":40},"[other.size])\n",[1493,1856,1858,1860],{"id":1857},"stdmove本身并不移动数据",[27,1859,182],{},"：本身并不移动数据",[16,1862,1863,1503,1865,1868],{},[27,1864,182],{},[27,1866,1867],{},"\u003Cutility>"," 中。它的作用不是复制数据，也不是搬运数据，而是把一个表达式转换成可以绑定到右值引用的形式。",[16,1870,1871],{},"它的函数模板可以简化理解为：",[20,1873,1875],{"className":22,"code":1874,"language":24,"meta":25,"style":25},"template\u003Cclass T>\nstd::remove_reference_t\u003CT>&& std::move(T&& value) noexcept;\n",[27,1876,1877,1890],{"__ignoreMap":25},[30,1878,1879,1881,1883,1885,1888],{"class":32,"line":33},[30,1880,1517],{"class":50},[30,1882,47],{"class":40},[30,1884,840],{"class":50},[30,1886,1887],{"class":36}," T",[30,1889,1534],{"class":40},[30,1891,1892,1894,1896,1899,1901,1904,1907,1909,1911,1913,1915,1917,1919,1921,1924,1926,1929],{"class":32,"line":63},[30,1893,37],{"class":36},[30,1895,41],{"class":40},[30,1897,1898],{"class":87},"remove_reference_t",[30,1900,47],{"class":40},[30,1902,1903],{"class":36},"T",[30,1905,1906],{"class":40},">",[30,1908,248],{"class":50},[30,1910,325],{"class":36},[30,1912,41],{"class":40},[30,1914,330],{"class":36},[30,1916,84],{"class":40},[30,1918,1903],{"class":36},[30,1920,248],{"class":50},[30,1922,1923],{"class":890}," value",[30,1925,1077],{"class":40},[30,1927,1928],{"class":50},"noexcept",[30,1930,568],{"class":40},[16,1932,1933],{},"对于下面这句代码：",[20,1935,1937],{"className":22,"code":1936,"language":24,"meta":25,"style":25},"std::move(buf2)\n",[27,1938,1939],{"__ignoreMap":25},[30,1940,1941,1943,1945,1947],{"class":32,"line":33},[30,1942,37],{"class":36},[30,1944,41],{"class":40},[30,1946,330],{"class":36},[30,1948,1949],{"class":40},"(buf2)\n",[16,1951,1952,1953,1956,1957,1960],{},"参数是 ",[27,1954,1955],{},"buf2","，返回结果可以简单理解为一个 ",[27,1958,1959],{},"Buffer&&","。它相当于告诉编译器：",[1643,1962,1963],{},[16,1964,1965,1967],{},[27,1966,1955],{}," 原来的资源可以被转移，不必继续保留原来的内容。",[16,1969,1970,1971,1974,1975,1977],{},"但 ",[27,1972,1973],{},"std::move(buf2)"," 这一表达式本身不会修改 ",[27,1976,1955],{},"。真正转移资源的是随后被调用的移动构造函数或移动赋值运算符。",[16,1979,1980],{},"例如：",[20,1982,1984],{"className":22,"code":1983,"language":24,"meta":25,"style":25},"Buffer buf3 = std::move(buf2);\n",[27,1985,1986],{"__ignoreMap":25},[30,1987,1988,1991,1993,1995,1997,1999],{"class":32,"line":33},[30,1989,1990],{"class":40},"Buffer buf3 ",[30,1992,229],{"class":50},[30,1994,325],{"class":36},[30,1996,41],{"class":40},[30,1998,330],{"class":36},[30,2000,1356],{"class":40},[16,2002,2003,2005],{},[27,2004,1973],{}," 使右侧表达式可以匹配：",[20,2007,2009],{"className":22,"code":2008,"language":24,"meta":25,"style":25},"Buffer(Buffer&& other) noexcept;\n",[27,2010,2011],{"__ignoreMap":25},[30,2012,2013,2015,2018,2020,2023,2025],{"class":32,"line":33},[30,2014,1070],{"class":36},[30,2016,2017],{"class":40},"(Buffer",[30,2019,248],{"class":50},[30,2021,2022],{"class":40}," other) ",[30,2024,1928],{"class":50},[30,2026,568],{"class":40},[16,2028,2029],{},"于是编译器调用移动构造函数，由移动构造函数真正接管指针：",[20,2031,2033],{"className":22,"code":2032,"language":24,"meta":25,"style":25},"Buffer(Buffer&& other) noexcept\n    : data(other.data), size(other.size)\n{\n    other.data = nullptr;\n    other.size = 0;\n}\n",[27,2034,2035,2047,2060,2064,2075,2086],{"__ignoreMap":25},[30,2036,2037,2039,2041,2043,2045],{"class":32,"line":33},[30,2038,1070],{"class":36},[30,2040,2017],{"class":40},[30,2042,248],{"class":50},[30,2044,2022],{"class":40},[30,2046,1080],{"class":50},[30,2048,2049,2052,2054,2056,2058],{"class":32,"line":63},[30,2050,2051],{"class":40},"    : ",[30,2053,897],{"class":36},[30,2055,1091],{"class":40},[30,2057,589],{"class":36},[30,2059,996],{"class":40},[30,2061,2062],{"class":32,"line":69},[30,2063,66],{"class":40},[30,2065,2066,2069,2071,2073],{"class":32,"line":94},[30,2067,2068],{"class":40},"    other.data ",[30,2070,229],{"class":50},[30,2072,1111],{"class":87},[30,2074,568],{"class":40},[30,2076,2077,2080,2082,2084],{"class":32,"line":101},[30,2078,2079],{"class":40},"    other.size ",[30,2081,229],{"class":50},[30,2083,769],{"class":87},[30,2085,568],{"class":40},[30,2087,2088],{"class":32,"line":113},[30,2089,116],{"class":40},[16,2091,2092],{},"因此，可以把它们的职责记成：",[20,2094,2097],{"className":2095,"code":2096,"language":788,"meta":25},[786],"std::copy：真正复制元素\nstd::move：把对象转换成“允许被移动”的表达式\n移动构造函数：真正负责转移资源\n",[27,2098,2096],{"__ignoreMap":25},[16,2100,2101],{},"单独写下面这句通常没有实际效果：",[20,2103,2105],{"className":22,"code":2104,"language":24,"meta":25,"style":25},"std::move(buf2);\n",[27,2106,2107],{"__ignoreMap":25},[30,2108,2109,2111,2113,2115],{"class":32,"line":33},[30,2110,37],{"class":36},[30,2112,41],{"class":40},[30,2114,330],{"class":36},[30,2116,1356],{"class":40},[16,2118,2119],{},"因为返回的右值引用没有被用于构造、赋值或函数传参，移动构造函数也就不会被调用。",[1493,2121,2123],{"id":2122},"拷贝构造为什么是深拷贝","拷贝构造为什么是“深拷贝”",[16,2125,2126],{},"下面这句会调用拷贝构造函数：",[20,2128,2130],{"className":22,"code":2129,"language":24,"meta":25,"style":25},"Buffer buf2 = buf1;\n",[27,2131,2132],{"__ignoreMap":25},[30,2133,2134,2137,2139],{"class":32,"line":33},[30,2135,2136],{"class":40},"Buffer buf2 ",[30,2138,229],{"class":50},[30,2140,1296],{"class":40},[16,2142,2143],{},"对应的构造函数是：",[20,2145,2147],{"className":22,"code":2146,"language":24,"meta":25,"style":25},"Buffer(const Buffer& other)\n    : data(new int[other.size]), size(other.size)\n{\n    std::copy(other.data, other.data + size, data);\n}\n",[27,2148,2149,2164,2182,2186,2200],{"__ignoreMap":25},[30,2150,2151,2153,2155,2157,2159,2161],{"class":32,"line":33},[30,2152,1070],{"class":36},[30,2154,84],{"class":40},[30,2156,969],{"class":50},[30,2158,972],{"class":40},[30,2160,975],{"class":50},[30,2162,2163],{"class":40}," other)\n",[30,2165,2166,2168,2170,2172,2174,2176,2178,2180],{"class":32,"line":63},[30,2167,2051],{"class":40},[30,2169,897],{"class":36},[30,2171,84],{"class":40},[30,2173,902],{"class":50},[30,2175,905],{"class":50},[30,2177,991],{"class":40},[30,2179,589],{"class":36},[30,2181,996],{"class":40},[30,2183,2184],{"class":32,"line":69},[30,2185,66],{"class":40},[30,2187,2188,2190,2192,2194,2196,2198],{"class":32,"line":94},[30,2189,72],{"class":36},[30,2191,41],{"class":40},[30,2193,1009],{"class":36},[30,2195,1012],{"class":40},[30,2197,259],{"class":50},[30,2199,1017],{"class":40},[30,2201,2202],{"class":32,"line":101},[30,2203,116],{"class":40},[16,2205,2206],{},"它做了两件事：",[1463,2208,2209,2215],{},[132,2210,2211,2212,2214],{},"为 ",[27,2213,1955],{}," 重新申请一块独立的数组内存；",[132,2216,2217,2218,2220],{},"把 ",[27,2219,1267],{}," 数组中的每个元素复制到新内存中。",[16,2222,2223],{},"拷贝完成后，两者保存的内容相同，但管理的是不同的内存：",[20,2225,2228],{"className":2226,"code":2227,"language":788,"meta":25},[786],"buf1.data ──> [buf1 自己的 1000 个 int]\n\nbuf2.data ──> [buf2 自己的 1000 个 int]\n",[27,2229,2227],{"__ignoreMap":25},[16,2231,2232],{},"所以销毁或修改其中一个对象，不会直接影响另一个对象，这就是深拷贝。",[1493,2234,2235],{"id":2235},"移动构造为什么要清空原对象",[16,2237,2238],{},"移动构造函数没有重新申请数组，也没有复制 1000 个元素，而是直接接管指针：",[20,2240,2242],{"className":22,"code":2241,"language":24,"meta":25,"style":25},"data(other.data), size(other.size)\n",[27,2243,2244],{"__ignoreMap":25},[30,2245,2246,2248,2250,2252],{"class":32,"line":33},[30,2247,897],{"class":36},[30,2249,1091],{"class":40},[30,2251,589],{"class":36},[30,2253,996],{"class":40},[16,2255,2256],{},"接管后必须执行：",[20,2258,2260],{"className":22,"code":2259,"language":24,"meta":25,"style":25},"other.data = nullptr;\nother.size = 0;\n",[27,2261,2262,2273],{"__ignoreMap":25},[30,2263,2264,2267,2269,2271],{"class":32,"line":33},[30,2265,2266],{"class":40},"other.data ",[30,2268,229],{"class":50},[30,2270,1111],{"class":87},[30,2272,568],{"class":40},[30,2274,2275,2278,2280,2282],{"class":32,"line":63},[30,2276,2277],{"class":40},"other.size ",[30,2279,229],{"class":50},[30,2281,769],{"class":87},[30,2283,568],{"class":40},[16,2285,2286],{},"否则新对象和原对象会同时保存同一个指针：",[20,2288,2291],{"className":2289,"code":2290,"language":788,"meta":25},[786],"buf2.data ─┐\n           ├──> [同一块数组内存]\nbuf3.data ─┘\n",[27,2292,2290],{"__ignoreMap":25},[16,2294,2295],{},"两个对象析构时都会执行：",[20,2297,2299],{"className":22,"code":2298,"language":24,"meta":25,"style":25},"delete[] data;\n",[27,2300,2301],{"__ignoreMap":25},[30,2302,2303,2306],{"class":32,"line":33},[30,2304,2305],{"class":50},"delete[]",[30,2307,855],{"class":40},[16,2309,2310],{},"这样就可能对同一块内存释放两次，产生未定义行为。",[16,2312,2313,2314,2317],{},"把原对象的指针设为 ",[27,2315,2316],{},"nullptr"," 后，所有权关系变成：",[20,2319,2322],{"className":2320,"code":2321,"language":788,"meta":25},[786],"buf2.data = nullptr\n\nbuf3.data ──> [原来由 buf2 管理的数组内存]\n",[27,2323,2321],{"__ignoreMap":25},[16,2325,2326],{},"而下面的操作是安全的：",[20,2328,2330],{"className":22,"code":2329,"language":24,"meta":25,"style":25},"delete[] nullptr;\n",[27,2331,2332],{"__ignoreMap":25},[30,2333,2334,2336,2338],{"class":32,"line":33},[30,2335,2305],{"class":50},[30,2337,1111],{"class":87},[30,2339,568],{"class":40},[16,2341,2342,2343,2345,2346,2348,2349,145],{},"所以移动后的 ",[27,2344,1955],{}," 仍然可以正常析构。在这个自定义实现中，我们还明确把它的 ",[27,2347,589],{}," 设成了 ",[27,2350,1678],{},[1493,2352,1477,2354,2356,2357],{"id":2353},"为什么-buffer-b-a-等同于-buffer-ba",[27,2355,1480],{}," 等同于 ",[27,2358,1484],{},[16,2360,2361,2362,782],{},"下面两种写法都在创建一个新的对象 ",[27,2363,2364],{},"b",[20,2366,2368],{"className":22,"code":2367,"language":24,"meta":25,"style":25},"Buffer b = a;  \u002F\u002F 拷贝初始化\nBuffer b(a);   \u002F\u002F 直接初始化\n",[27,2369,2370,2383],{"__ignoreMap":25},[30,2371,2372,2375,2377,2380],{"class":32,"line":33},[30,2373,2374],{"class":40},"Buffer b ",[30,2376,229],{"class":50},[30,2378,2379],{"class":40}," a;",[30,2381,2382],{"class":97},"  \u002F\u002F 拷贝初始化\n",[30,2384,2385,2387,2390,2392,2395,2398],{"class":32,"line":63},[30,2386,1070],{"class":36},[30,2388,2389],{"class":36}," b",[30,2391,84],{"class":40},[30,2393,2394],{"class":36},"a",[30,2396,2397],{"class":40},");",[30,2399,2400],{"class":97},"   \u002F\u002F 直接初始化\n",[16,2402,2403,2404,2406,2407,2409],{},"虽然第一种写法中出现了等号，但这里的 ",[27,2405,229],{}," 不是赋值运算符，因为 ",[27,2408,2364],{}," 在这条语句执行前还不存在，它正在被创建。",[16,2411,2412,2413,2415,2416,2418,2419,2421,2422,2424],{},"两种写法都会寻找一个能够使用 ",[27,2414,2394],{}," 来构造 ",[27,2417,2364],{}," 的构造函数。由于 ",[27,2420,2394],{}," 的类型是 ",[27,2423,1070],{},"，所以都会匹配：",[20,2426,2428],{"className":22,"code":2427,"language":24,"meta":25,"style":25},"Buffer(const Buffer& other);\n",[27,2429,2430],{"__ignoreMap":25},[30,2431,2432,2434,2436,2438,2440,2442],{"class":32,"line":33},[30,2433,1070],{"class":36},[30,2435,84],{"class":40},[30,2437,969],{"class":50},[30,2439,972],{"class":40},[30,2441,975],{"class":50},[30,2443,2444],{"class":40}," other);\n",[16,2446,2447],{},"也就是拷贝构造函数。",[16,2449,2450],{},"可以把它们理解成：",[20,2452,2454],{"className":22,"code":2453,"language":24,"meta":25,"style":25},"Buffer b = a;  \u002F\u002F 创建 b，并用 a 初始化\nBuffer b(a);   \u002F\u002F 创建 b，并用 a 初始化\n",[27,2455,2456,2467],{"__ignoreMap":25},[30,2457,2458,2460,2462,2464],{"class":32,"line":33},[30,2459,2374],{"class":40},[30,2461,229],{"class":50},[30,2463,2379],{"class":40},[30,2465,2466],{"class":97},"  \u002F\u002F 创建 b，并用 a 初始化\n",[30,2468,2469,2471,2473,2475,2477,2479],{"class":32,"line":63},[30,2470,1070],{"class":36},[30,2472,2389],{"class":36},[30,2474,84],{"class":40},[30,2476,2394],{"class":36},[30,2478,2397],{"class":40},[30,2480,2481],{"class":97},"   \u002F\u002F 创建 b，并用 a 初始化\n",[16,2483,2484],{},"对于本例，这两种写法的效果相同。",[1493,2486,2487],{"id":2487},"构造和赋值的判断方法",[16,2489,2490],{},"判断调用的是构造函数还是赋值运算符，关键不在于有没有等号，而在于左侧对象是否正在被创建。",[20,2492,2494],{"className":22,"code":2493,"language":24,"meta":25,"style":25},"Buffer a(1000);\n\nBuffer b = a;  \u002F\u002F b 正在创建：调用拷贝构造函数\nBuffer c(a);   \u002F\u002F c 正在创建：调用拷贝构造函数\n\nBuffer d = std::move(a);  \u002F\u002F d 正在创建：调用移动构造函数\nBuffer e(std::move(b));   \u002F\u002F e 正在创建：调用移动构造函数\n",[27,2495,2496,2509,2513,2524,2540,2544,2563],{"__ignoreMap":25},[30,2497,2498,2500,2503,2505,2507],{"class":32,"line":33},[30,2499,1070],{"class":36},[30,2501,2502],{"class":36}," a",[30,2504,84],{"class":40},[30,2506,1272],{"class":87},[30,2508,91],{"class":40},[30,2510,2511],{"class":32,"line":63},[30,2512,271],{"emptyLinePlaceholder":270},[30,2514,2515,2517,2519,2521],{"class":32,"line":69},[30,2516,2374],{"class":40},[30,2518,229],{"class":50},[30,2520,2379],{"class":40},[30,2522,2523],{"class":97},"  \u002F\u002F b 正在创建：调用拷贝构造函数\n",[30,2525,2526,2528,2531,2533,2535,2537],{"class":32,"line":94},[30,2527,1070],{"class":36},[30,2529,2530],{"class":36}," c",[30,2532,84],{"class":40},[30,2534,2394],{"class":36},[30,2536,2397],{"class":40},[30,2538,2539],{"class":97},"   \u002F\u002F c 正在创建：调用拷贝构造函数\n",[30,2541,2542],{"class":32,"line":101},[30,2543,271],{"emptyLinePlaceholder":270},[30,2545,2546,2549,2551,2553,2555,2557,2560],{"class":32,"line":113},[30,2547,2548],{"class":40},"Buffer d ",[30,2550,229],{"class":50},[30,2552,325],{"class":36},[30,2554,41],{"class":40},[30,2556,330],{"class":36},[30,2558,2559],{"class":40},"(a);",[30,2561,2562],{"class":97},"  \u002F\u002F d 正在创建：调用移动构造函数\n",[30,2564,2565,2567,2570,2572,2574,2576,2578,2581],{"class":32,"line":521},[30,2566,1070],{"class":36},[30,2568,2569],{"class":36}," e",[30,2571,84],{"class":40},[30,2573,37],{"class":36},[30,2575,41],{"class":40},[30,2577,330],{"class":36},[30,2579,2580],{"class":40},"(b));",[30,2582,2583],{"class":97},"   \u002F\u002F e 正在创建：调用移动构造函数\n",[16,2585,2586],{},"如果对象已经存在，再使用等号，才是赋值：",[20,2588,2590],{"className":22,"code":2589,"language":24,"meta":25,"style":25},"Buffer x(100);\nBuffer y(200);\n\nx = y;             \u002F\u002F x 已存在：调用拷贝赋值运算符\nx = std::move(y);  \u002F\u002F x 已存在：调用移动赋值运算符\n",[27,2591,2592,2606,2620,2624,2637],{"__ignoreMap":25},[30,2593,2594,2596,2599,2601,2604],{"class":32,"line":33},[30,2595,1070],{"class":36},[30,2597,2598],{"class":36}," x",[30,2600,84],{"class":40},[30,2602,2603],{"class":87},"100",[30,2605,91],{"class":40},[30,2607,2608,2610,2613,2615,2618],{"class":32,"line":63},[30,2609,1070],{"class":36},[30,2611,2612],{"class":36}," y",[30,2614,84],{"class":40},[30,2616,2617],{"class":87},"200",[30,2619,91],{"class":40},[30,2621,2622],{"class":32,"line":69},[30,2623,271],{"emptyLinePlaceholder":270},[30,2625,2626,2629,2631,2634],{"class":32,"line":94},[30,2627,2628],{"class":40},"x ",[30,2630,229],{"class":50},[30,2632,2633],{"class":40}," y;",[30,2635,2636],{"class":97},"             \u002F\u002F x 已存在：调用拷贝赋值运算符\n",[30,2638,2639,2641,2643,2645,2647,2649,2652],{"class":32,"line":101},[30,2640,2628],{"class":40},[30,2642,229],{"class":50},[30,2644,325],{"class":36},[30,2646,41],{"class":40},[30,2648,330],{"class":36},[30,2650,2651],{"class":40},"(y);",[30,2653,2654],{"class":97},"  \u002F\u002F x 已存在：调用移动赋值运算符\n",[16,2656,2657],{},"可以用一句话记忆：",[1643,2659,2660],{},[16,2661,2662],{},"对象正在“出生”时调用构造函数；对象已经存在，只是更换内容时调用赋值运算符。",[16,2664,2665],{},"对应关系如下：",[342,2667,2668,2681],{},[345,2669,2670],{},[348,2671,2672,2675,2678],{},[351,2673,2674],{"align":353},"写法",[351,2676,2677],{"align":353},"对象状态",[351,2679,2680],{"align":353},"调用的函数",[362,2682,2683,2697,2709,2723,2736,2751],{},[348,2684,2685,2689,2694],{},[367,2686,2687],{"align":353},[27,2688,1480],{},[367,2690,2691,2693],{"align":353},[27,2692,2364],{}," 正在创建",[367,2695,2696],{"align":353},"拷贝构造函数",[348,2698,2699,2703,2707],{},[367,2700,2701],{"align":353},[27,2702,1484],{},[367,2704,2705,2693],{"align":353},[27,2706,2364],{},[367,2708,2696],{"align":353},[348,2710,2711,2716,2720],{},[367,2712,2713],{"align":353},[27,2714,2715],{},"Buffer b = std::move(a);",[367,2717,2718,2693],{"align":353},[27,2719,2364],{},[367,2721,2722],{"align":353},"移动构造函数",[348,2724,2725,2730,2734],{},[367,2726,2727],{"align":353},[27,2728,2729],{},"Buffer b(std::move(a));",[367,2731,2732,2693],{"align":353},[27,2733,2364],{},[367,2735,2722],{"align":353},[348,2737,2738,2743,2748],{},[367,2739,2740],{"align":353},[27,2741,2742],{},"b = a;",[367,2744,2745,2747],{"align":353},[27,2746,2364],{}," 已经存在",[367,2749,2750],{"align":353},"拷贝赋值运算符",[348,2752,2753,2758,2762],{},[367,2754,2755],{"align":353},[27,2756,2757],{},"b = std::move(a);",[367,2759,2760,2747],{"align":353},[27,2761,2364],{},[367,2763,2764],{"align":353},"移动赋值运算符",[1493,2766,2767],{"id":2767},"拷贝初始化和直接初始化并非永远相同",[16,2769,2770],{},"从语法分类上看：",[20,2772,2774],{"className":22,"code":2773,"language":24,"meta":25,"style":25},"Buffer b = a;  \u002F\u002F copy-initialization，拷贝初始化\nBuffer b(a);   \u002F\u002F direct-initialization，直接初始化\n",[27,2775,2776,2787],{"__ignoreMap":25},[30,2777,2778,2780,2782,2784],{"class":32,"line":33},[30,2779,2374],{"class":40},[30,2781,229],{"class":50},[30,2783,2379],{"class":40},[30,2785,2786],{"class":97},"  \u002F\u002F copy-initialization，拷贝初始化\n",[30,2788,2789,2791,2793,2795,2797,2799],{"class":32,"line":63},[30,2790,1070],{"class":36},[30,2792,2389],{"class":36},[30,2794,84],{"class":40},[30,2796,2394],{"class":36},[30,2798,2397],{"class":40},[30,2800,2801],{"class":97},"   \u002F\u002F direct-initialization，直接初始化\n",[16,2803,2804,2805,2807,2808,2811],{},"在当前 ",[27,2806,1070],{}," 示例中，它们都会调用普通的拷贝构造函数，因此效果相同。但面对带有 ",[27,2809,2810],{},"explicit"," 的转换构造函数时，两者会出现区别。",[16,2813,1980],{},[20,2815,2817],{"className":22,"code":2816,"language":24,"meta":25,"style":25},"class Number\n{\npublic:\n    explicit Number(int value)\n    {\n    }\n};\n",[27,2818,2819,2826,2830,2834,2851,2855,2859],{"__ignoreMap":25},[30,2820,2821,2823],{"class":32,"line":33},[30,2822,840],{"class":50},[30,2824,2825],{"class":36}," Number\n",[30,2827,2828],{"class":32,"line":63},[30,2829,66],{"class":40},[30,2831,2832],{"class":32,"line":69},[30,2833,872],{"class":50},[30,2835,2836,2839,2842,2844,2846,2848],{"class":32,"line":94},[30,2837,2838],{"class":50},"    explicit",[30,2840,2841],{"class":36}," Number",[30,2843,84],{"class":40},[30,2845,51],{"class":50},[30,2847,1923],{"class":890},[30,2849,2850],{"class":40},")\n",[30,2852,2853],{"class":32,"line":101},[30,2854,918],{"class":40},[30,2856,2857],{"class":32,"line":113},[30,2858,951],{"class":40},[30,2860,2861],{"class":32,"line":521},[30,2862,309],{"class":40},[16,2864,2865],{},"直接初始化可以显式调用这个构造函数：",[20,2867,2869],{"className":22,"code":2868,"language":24,"meta":25,"style":25},"Number n1(10);  \u002F\u002F 正确\n",[27,2870,2871],{"__ignoreMap":25},[30,2872,2873,2876,2879,2881,2884,2886],{"class":32,"line":33},[30,2874,2875],{"class":36},"Number",[30,2877,2878],{"class":36}," n1",[30,2880,84],{"class":40},[30,2882,2883],{"class":87},"10",[30,2885,2397],{"class":40},[30,2887,2888],{"class":97},"  \u002F\u002F 正确\n",[16,2890,2891,2892,2894],{},"拷贝初始化则不允许隐式使用 ",[27,2893,2810],{}," 构造函数：",[20,2896,2898],{"className":22,"code":2897,"language":24,"meta":25,"style":25},"Number n2 = 10;  \u002F\u002F 错误\n",[27,2899,2900],{"__ignoreMap":25},[30,2901,2902,2905,2907,2910,2912],{"class":32,"line":33},[30,2903,2904],{"class":40},"Number n2 ",[30,2906,229],{"class":50},[30,2908,2909],{"class":87}," 10",[30,2911,235],{"class":40},[30,2913,2914],{"class":97},"  \u002F\u002F 错误\n",[16,2916,2917],{},"因此，更准确的说法是：",[1643,2919,2920],{},[16,2921,2922,2923,1481,2925,2927],{},"对于本例中的同类型对象拷贝，",[27,2924,1480],{},[27,2926,1484],{}," 都调用拷贝构造函数；但“拷贝初始化”和“直接初始化”在所有场景下并不完全等价。",[1643,2929,2930],{},[16,2931,2932,2935,2936,2938,2939,1481,2942,2945,2946,145],{},[121,2933,2934],{},"补充："," 当前 ",[27,2937,1070],{}," 类手动管理动态内存，但只实现了析构函数、拷贝构造函数和移动构造函数。若还要安全支持 ",[27,2940,2941],{},"b = a",[27,2943,2944],{},"b = std::move(a)","，还应实现拷贝赋值运算符与移动赋值运算符，这通常称为 ",[121,2947,2948],{},"Rule of Five（五法则）",[443,2950,2952],{"id":2951},"示例-3在示例-2-基础上移动语义让函数返回大对象高效","示例 3：在示例 2 基础上，移动语义让函数返回大对象高效",[20,2954,2956],{"className":22,"code":2955,"language":24,"meta":25,"style":25},"#include \u003Ciostream>\n#include \u003Cvector>\n#include \u003Cstring>\n\n\u002F\u002F 返回大 vector（C++11 起自动启用移动语义，不需要手动 std::move）\nstd::vector\u003Cint> make_data(int n)\n{\n    std::vector\u003Cint> v(n);\n    for (int i = 0; i \u003C n; ++i)\n    {\n        v[i] = i * 10;\n    }\n    return v;  \u002F\u002F ✅ 编译器自动移动（或 RVO 优化），不拷贝\n}\n\nint main()\n{\n    auto data = make_data(5);\n    std::cout \u003C\u003C \"data: \";\n    for (int n : data)\n    {\n        std::cout \u003C\u003C n \u003C\u003C \" \";\n    }\n    std::cout \u003C\u003C \"\\n\";\n    std::cout \u003C\u003C \"size = \" \u003C\u003C data.size() \u003C\u003C \"\\n\";\n\n    \u002F\u002F ⚠️ 错误做法：不要对返回值用 std::move！\n    \u002F\u002F auto data2 = std::move(make_data(5));  \u002F\u002F ❌ 不要这样写！破坏 RVO 优化\n\n    \u002F\u002F ✅ 正确做法：赋值给已有变量时用 = std::move(source)\n    std::vector\u003Cint> old = {100, 200};\n    std::vector\u003Cint> fresh = std::move(old);  \u002F\u002F 把 old 的内容移给 fresh\n    std::cout \u003C\u003C \"old size = \" \u003C\u003C old.size() \u003C\u003C \"\\n\";      \u002F\u002F 0\n    std::cout \u003C\u003C \"fresh size = \" \u003C\u003C fresh.size() \u003C\u003C \"\\n\";  \u002F\u002F 2\n\n    return 0;\n}\n",[27,2957,2958,2964,2970,2976,2980,2985,3010,3014,3027,3053,3057,3073,3077,3086,3090,3094,3102,3106,3125,3138,3149,3153,3170,3174,3190,3220,3224,3229,3237,3241,3246,3269,3294,3327,3360,3364,3372],{"__ignoreMap":25},[30,2959,2960,2962],{"class":32,"line":33},[30,2961,203],{"class":50},[30,2963,458],{"class":206},[30,2965,2966,2968],{"class":32,"line":63},[30,2967,203],{"class":50},[30,2969,465],{"class":206},[30,2971,2972,2974],{"class":32,"line":69},[30,2973,203],{"class":50},[30,2975,822],{"class":206},[30,2977,2978],{"class":32,"line":94},[30,2979,271],{"emptyLinePlaceholder":270},[30,2981,2982],{"class":32,"line":101},[30,2983,2984],{"class":97},"\u002F\u002F 返回大 vector（C++11 起自动启用移动语义，不需要手动 std::move）\n",[30,2986,2987,2989,2991,2993,2995,2997,2999,3002,3004,3006,3008],{"class":32,"line":113},[30,2988,37],{"class":36},[30,2990,41],{"class":40},[30,2992,44],{"class":36},[30,2994,47],{"class":40},[30,2996,51],{"class":50},[30,2998,54],{"class":40},[30,3000,3001],{"class":36},"make_data",[30,3003,84],{"class":40},[30,3005,51],{"class":50},[30,3007,891],{"class":890},[30,3009,2850],{"class":40},[30,3011,3012],{"class":32,"line":521},[30,3013,66],{"class":40},[30,3015,3016,3018,3020,3022,3024],{"class":32,"line":526},[30,3017,72],{"class":36},[30,3019,75],{"class":40},[30,3021,78],{"class":50},[30,3023,81],{"class":36},[30,3025,3026],{"class":40},"(n);\n",[30,3028,3029,3032,3034,3036,3038,3040,3042,3044,3046,3049,3051],{"class":32,"line":532},[30,3030,3031],{"class":50},"    for",[30,3033,1739],{"class":40},[30,3035,51],{"class":50},[30,3037,1744],{"class":40},[30,3039,229],{"class":50},[30,3041,769],{"class":87},[30,3043,1751],{"class":40},[30,3045,47],{"class":50},[30,3047,3048],{"class":40}," n; ",[30,3050,1759],{"class":50},[30,3052,1762],{"class":40},[30,3054,3055],{"class":32,"line":548},[30,3056,918],{"class":40},[30,3058,3059,3062,3064,3066,3069,3071],{"class":32,"line":571},[30,3060,3061],{"class":40},"        v[i] ",[30,3063,229],{"class":50},[30,3065,1744],{"class":40},[30,3067,3068],{"class":50},"*",[30,3070,2909],{"class":87},[30,3072,568],{"class":40},[30,3074,3075],{"class":32,"line":609},[30,3076,951],{"class":40},[30,3078,3079,3081,3083],{"class":32,"line":642},[30,3080,104],{"class":50},[30,3082,107],{"class":40},[30,3084,3085],{"class":97},"  \u002F\u002F ✅ 编译器自动移动（或 RVO 优化），不拷贝\n",[30,3087,3088],{"class":32,"line":647},[30,3089,116],{"class":40},[30,3091,3092],{"class":32,"line":653},[30,3093,271],{"emptyLinePlaceholder":270},[30,3095,3096,3098,3100],{"class":32,"line":676},[30,3097,51],{"class":50},[30,3099,476],{"class":36},[30,3101,60],{"class":40},[30,3103,3104],{"class":32,"line":694},[30,3105,66],{"class":40},[30,3107,3108,3111,3114,3116,3119,3121,3123],{"class":32,"line":726},[30,3109,3110],{"class":50},"    auto",[30,3112,3113],{"class":40}," data ",[30,3115,229],{"class":50},[30,3117,3118],{"class":36}," make_data",[30,3120,84],{"class":40},[30,3122,516],{"class":87},[30,3124,91],{"class":40},[30,3126,3127,3129,3131,3133,3136],{"class":32,"line":759},[30,3128,72],{"class":36},[30,3130,553],{"class":40},[30,3132,556],{"class":50},[30,3134,3135],{"class":206}," \"data: \"",[30,3137,568],{"class":40},[30,3139,3140,3142,3144,3146],{"class":32,"line":764},[30,3141,3031],{"class":50},[30,3143,1739],{"class":40},[30,3145,51],{"class":50},[30,3147,3148],{"class":40}," n : data)\n",[30,3150,3151],{"class":32,"line":774},[30,3152,918],{"class":40},[30,3154,3155,3157,3159,3161,3163,3165,3168],{"class":32,"line":1020},[30,3156,923],{"class":36},[30,3158,553],{"class":40},[30,3160,556],{"class":50},[30,3162,935],{"class":40},[30,3164,556],{"class":50},[30,3166,3167],{"class":206}," \" \"",[30,3169,568],{"class":40},[30,3171,3172],{"class":32,"line":1047},[30,3173,951],{"class":40},[30,3175,3176,3178,3180,3182,3184,3186,3188],{"class":32,"line":1052},[30,3177,72],{"class":36},[30,3179,553],{"class":40},[30,3181,556],{"class":50},[30,3183,597],{"class":206},[30,3185,562],{"class":87},[30,3187,565],{"class":206},[30,3189,568],{"class":40},[30,3191,3192,3194,3196,3198,3201,3203,3206,3208,3210,3212,3214,3216,3218],{"class":32,"line":1057},[30,3193,72],{"class":36},[30,3195,553],{"class":40},[30,3197,556],{"class":50},[30,3199,3200],{"class":206}," \"size = \"",[30,3202,583],{"class":50},[30,3204,3205],{"class":40}," data.",[30,3207,589],{"class":36},[30,3209,592],{"class":40},[30,3211,556],{"class":50},[30,3213,597],{"class":206},[30,3215,562],{"class":87},[30,3217,565],{"class":206},[30,3219,568],{"class":40},[30,3221,3222],{"class":32,"line":1063},[30,3223,271],{"emptyLinePlaceholder":270},[30,3225,3226],{"class":32,"line":1083},[30,3227,3228],{"class":97},"    \u002F\u002F ⚠️ 错误做法：不要对返回值用 std::move！\n",[30,3230,3231,3234],{"class":32,"line":1098},[30,3232,3233],{"class":97},"    \u002F\u002F auto data2 = std::move(make_data(5));",[30,3235,3236],{"class":97},"  \u002F\u002F ❌ 不要这样写！破坏 RVO 优化\n",[30,3238,3239],{"class":32,"line":1103},[30,3240,271],{"emptyLinePlaceholder":270},[30,3242,3243],{"class":32,"line":1119},[30,3244,3245],{"class":97},"    \u002F\u002F ✅ 正确做法：赋值给已有变量时用 = std::move(source)\n",[30,3247,3248,3250,3252,3254,3257,3259,3261,3263,3265,3267],{"class":32,"line":1131},[30,3249,72],{"class":36},[30,3251,75],{"class":40},[30,3253,78],{"class":50},[30,3255,3256],{"class":40}," old ",[30,3258,229],{"class":50},[30,3260,292],{"class":40},[30,3262,2603],{"class":87},[30,3264,298],{"class":40},[30,3266,2617],{"class":87},[30,3268,309],{"class":40},[30,3270,3271,3273,3275,3277,3280,3282,3284,3286,3288,3291],{"class":32,"line":1157},[30,3272,72],{"class":36},[30,3274,75],{"class":40},[30,3276,78],{"class":50},[30,3278,3279],{"class":40}," fresh ",[30,3281,229],{"class":50},[30,3283,325],{"class":36},[30,3285,41],{"class":40},[30,3287,330],{"class":36},[30,3289,3290],{"class":40},"(old);",[30,3292,3293],{"class":97},"  \u002F\u002F 把 old 的内容移给 fresh\n",[30,3295,3296,3298,3300,3302,3305,3307,3310,3312,3314,3316,3318,3320,3322,3324],{"class":32,"line":1162},[30,3297,72],{"class":36},[30,3299,553],{"class":40},[30,3301,556],{"class":50},[30,3303,3304],{"class":206}," \"old size = \"",[30,3306,583],{"class":50},[30,3308,3309],{"class":40}," old.",[30,3311,589],{"class":36},[30,3313,592],{"class":40},[30,3315,556],{"class":50},[30,3317,597],{"class":206},[30,3319,562],{"class":87},[30,3321,565],{"class":206},[30,3323,235],{"class":40},[30,3325,3326],{"class":97},"      \u002F\u002F 0\n",[30,3328,3329,3331,3333,3335,3338,3340,3343,3345,3347,3349,3351,3353,3355,3357],{"class":32,"line":1167},[30,3330,72],{"class":36},[30,3332,553],{"class":40},[30,3334,556],{"class":50},[30,3336,3337],{"class":206}," \"fresh size = \"",[30,3339,583],{"class":50},[30,3341,3342],{"class":40}," fresh.",[30,3344,589],{"class":36},[30,3346,592],{"class":40},[30,3348,556],{"class":50},[30,3350,597],{"class":206},[30,3352,562],{"class":87},[30,3354,565],{"class":206},[30,3356,235],{"class":40},[30,3358,3359],{"class":97},"  \u002F\u002F 2\n",[30,3361,3362],{"class":32,"line":1175},[30,3363,271],{"emptyLinePlaceholder":270},[30,3365,3366,3368,3370],{"class":32,"line":1180},[30,3367,104],{"class":50},[30,3369,769],{"class":87},[30,3371,568],{"class":40},[30,3373,3374],{"class":32,"line":1188},[30,3375,116],{"class":40},[16,3377,3378,782],{},[121,3379,781],{},[20,3381,3384],{"className":3382,"code":3383,"language":788},[786],"data: 0 10 20 30 40 \nsize = 5\nold size = 0\nfresh size = 2\n",[27,3385,3383],{"__ignoreMap":25},[12,3387,3388],{"id":3388},"示例中的关键语法解释",[342,3390,3391,3410],{},[345,3392,3393],{},[348,3394,3395,3398,3401,3404,3407],{},[351,3396,3397],{"align":353},"示例",[351,3399,3400],{"align":353},"讲了什么",[351,3402,3403],{"align":353},"新出现的语法",[351,3405,3406],{"align":353},"为什么这样写",[351,3408,3409],{"align":353},"注意事项",[362,3411,3412,3432,3456],{},[348,3413,3414,3417,3420,3426,3429],{},[367,3415,3416],{"align":353},"示例 1",[367,3418,3419],{"align":353},"拷贝 vs 移动对比",[367,3421,3422,3425],{"align":353},[27,3423,3424],{},"std::move()","、移动后 size=0",[367,3427,3428],{"align":353},"move 后源对象被\"掏空\"，变成有效但未指定状态",[367,3430,3431],{"align":353},"move 后不要再使用源对象（除非重新赋值）",[348,3433,3434,3437,3440,3450,3453],{},[367,3435,3436],{"align":353},"示例 2",[367,3438,3439],{"align":353},"自定义移动构造",[367,3441,3442,141,3445,141,3447],{"align":353},[27,3443,3444],{},"Buffer(Buffer&&)",[27,3446,1928],{},[27,3448,3449],{},"other.data=nullptr",[367,3451,3452],{"align":353},"移动构造直接偷指针，不分配新内存",[367,3454,3455],{"align":353},"移动后必须把 other.data 置 null，否则重复 delete",[348,3457,3458,3461,3464,3471,3474],{},[367,3459,3460],{"align":353},"示例 3",[367,3462,3463],{"align":353},"返回值和赋值优化",[367,3465,3466,3467,3470],{"align":353},"RVO、",[27,3468,3469],{},"return v"," 不加 move",[367,3472,3473],{"align":353},"编译器会优化返回值为移动\u002FRVO，加了 move 反而阻止 RVO",[367,3475,3476],{"align":353},"局部变量 return 时不要加 std::move",[12,3478,3480],{"id":3479},"为什么移动构造要写-noexcept","为什么移动构造要写 noexcept",[16,3482,3483,3486,3487,3489,3490,3492],{},[27,3484,3485],{},"std::vector"," 扩容时要把旧元素搬到新内存。如果元素类型的移动构造可能抛异常，",[27,3488,44],{}," 为了保证异常安全，可能宁愿走拷贝构造。也就是说：你明明写了移动构造，但如果没写 ",[27,3491,1928],{},"，容器扩容时不一定用它。",[20,3494,3496],{"className":22,"code":3495,"language":24,"meta":25,"style":25},"class Buffer\n{\npublic:\n    Buffer(Buffer&& other) noexcept\n    {\n        \u002F\u002F 偷资源，不抛异常\n    }\n};\n",[27,3497,3498,3504,3508,3512,3528,3532,3537,3541],{"__ignoreMap":25},[30,3499,3500,3502],{"class":32,"line":33},[30,3501,840],{"class":50},[30,3503,843],{"class":36},[30,3505,3506],{"class":32,"line":63},[30,3507,66],{"class":40},[30,3509,3510],{"class":32,"line":69},[30,3511,872],{"class":50},[30,3513,3514,3516,3518,3520,3522,3524,3526],{"class":32,"line":94},[30,3515,882],{"class":36},[30,3517,84],{"class":40},[30,3519,1070],{"class":36},[30,3521,248],{"class":50},[30,3523,978],{"class":890},[30,3525,1077],{"class":40},[30,3527,1080],{"class":50},[30,3529,3530],{"class":32,"line":101},[30,3531,918],{"class":40},[30,3533,3534],{"class":32,"line":113},[30,3535,3536],{"class":97},"        \u002F\u002F 偷资源，不抛异常\n",[30,3538,3539],{"class":32,"line":521},[30,3540,951],{"class":40},[30,3542,3543],{"class":32,"line":526},[30,3544,309],{"class":40},[16,3546,3547,3548,3551,3552,3555,3556,3558],{},"这个差异在单独移动一个对象时看不明显；当 ",[27,3549,3550],{},"vector\u003CBuffer>"," 大量 ",[27,3553,3554],{},"push_back"," 触发扩容时，是否 ",[27,3557,1928],{}," 才会影响容器选择移动还是拷贝。",[12,3560,3562],{"id":3561},"stdmove-什么时候该用什么时候不该用","std::move 什么时候该用，什么时候不该用",[342,3564,3565,3580],{},[345,3566,3567],{},[348,3568,3569,3572,3577],{},[351,3570,3571],{"align":353},"场景",[351,3573,3574,3575],{"align":353},"是否用 ",[27,3576,182],{},[351,3578,3579],{"align":353},"原因",[362,3581,3582,3593,3608,3621,3634],{},[348,3583,3584,3587,3590],{},[367,3585,3586],{"align":353},"把已有对象的资源转给另一个对象",[367,3588,3589],{"align":353},"✅",[367,3591,3592],{"align":353},"明确转移所有权或内容",[348,3594,3595,3601,3603],{},[367,3596,2217,3597,3600],{"align":353},[27,3598,3599],{},"unique_ptr"," 传给接收所有权的函数",[367,3602,3589],{"align":353},[367,3604,3605,3607],{"align":353},[27,3606,3599],{}," 不能拷贝，只能移动",[348,3609,3610,3615,3618],{},[367,3611,3612,3614],{"align":353},[27,3613,1231],{}," 局部变量",[367,3616,3617],{"align":353},"❌",[367,3619,3620],{"align":353},"让编译器做 RVO \u002F NRVO",[348,3622,3623,3629,3631],{},[367,3624,3625,3626,3628],{"align":353},"对 ",[27,3627,969],{}," 对象",[367,3630,3617],{"align":353},[367,3632,3633],{"align":353},"const 对象不能被真正移动，通常变成拷贝",[348,3635,3636,3639,3641],{},[367,3637,3638],{"align":353},"move 后还想继续读原对象内容",[367,3640,3617],{"align":353},[367,3642,3643],{"align":353},"moved-from 对象只保证可析构、可重新赋值",[12,3645,3646],{"id":3646},"常见错误",[16,3648,3649],{},[121,3650,3651],{},"错误 1：move 之后继续使用源对象",[20,3653,3655],{"className":22,"code":3654,"language":24,"meta":25,"style":25},"std::vector\u003Cint> a = {1, 2, 3};\nstd::vector\u003Cint> b = std::move(a);\nstd::cout \u003C\u003C a[0];  \u002F\u002F ❌ a 已经被\"掏空\"，行为未定义\n",[27,3656,3657,3684,3706],{"__ignoreMap":25},[30,3658,3659,3661,3663,3665,3668,3670,3672,3674,3676,3678,3680,3682],{"class":32,"line":33},[30,3660,37],{"class":36},[30,3662,75],{"class":40},[30,3664,78],{"class":50},[30,3666,3667],{"class":40}," a ",[30,3669,229],{"class":50},[30,3671,292],{"class":40},[30,3673,295],{"class":87},[30,3675,298],{"class":40},[30,3677,301],{"class":87},[30,3679,298],{"class":40},[30,3681,306],{"class":87},[30,3683,309],{"class":40},[30,3685,3686,3688,3690,3692,3695,3697,3699,3701,3703],{"class":32,"line":63},[30,3687,37],{"class":36},[30,3689,75],{"class":40},[30,3691,78],{"class":50},[30,3693,3694],{"class":40}," b ",[30,3696,229],{"class":50},[30,3698,325],{"class":36},[30,3700,41],{"class":40},[30,3702,330],{"class":36},[30,3704,3705],{"class":40},"(a);\n",[30,3707,3708,3710,3712,3714,3717,3719,3722],{"class":32,"line":69},[30,3709,37],{"class":36},[30,3711,553],{"class":40},[30,3713,556],{"class":50},[30,3715,3716],{"class":40}," a[",[30,3718,1678],{"class":87},[30,3720,3721],{"class":40},"];",[30,3723,3724],{"class":97},"  \u002F\u002F ❌ a 已经被\"掏空\"，行为未定义\n",[16,3726,3727],{},"正确做法：move 后不要再使用源对象，或者先检查是否为空。",[16,3729,3730],{},[121,3731,3732],{},"错误 2：对 const 对象用 move",[20,3734,3736],{"className":22,"code":3735,"language":24,"meta":25,"style":25},"const std::vector\u003Cint> a = {1, 2, 3};\nstd::vector\u003Cint> b = std::move(a);  \u002F\u002F ❌ 实际执行的是拷贝！const 对象不能移动\n",[27,3737,3738,3766],{"__ignoreMap":25},[30,3739,3740,3742,3744,3746,3748,3750,3752,3754,3756,3758,3760,3762,3764],{"class":32,"line":33},[30,3741,969],{"class":50},[30,3743,325],{"class":36},[30,3745,75],{"class":40},[30,3747,78],{"class":50},[30,3749,3667],{"class":40},[30,3751,229],{"class":50},[30,3753,292],{"class":40},[30,3755,295],{"class":87},[30,3757,298],{"class":40},[30,3759,301],{"class":87},[30,3761,298],{"class":40},[30,3763,306],{"class":87},[30,3765,309],{"class":40},[30,3767,3768,3770,3772,3774,3776,3778,3780,3782,3784,3786],{"class":32,"line":63},[30,3769,37],{"class":36},[30,3771,75],{"class":40},[30,3773,78],{"class":50},[30,3775,3694],{"class":40},[30,3777,229],{"class":50},[30,3779,325],{"class":36},[30,3781,41],{"class":40},[30,3783,330],{"class":36},[30,3785,2559],{"class":40},[30,3787,3788],{"class":97},"  \u002F\u002F ❌ 实际执行的是拷贝！const 对象不能移动\n",[16,3790,3791],{},"正确做法：move 不要用于 const 对象。",[16,3793,3794],{},[121,3795,3796],{},"错误 3：给返回值加 std::move",[20,3798,3800],{"className":22,"code":3799,"language":24,"meta":25,"style":25},"std::vector\u003Cint> func()\n{\n    std::vector\u003Cint> v(1000);\n    return std::move(v);  \u002F\u002F ❌ 阻止了 RVO 优化！\n}\n",[27,3801,3802,3821,3825,3841,3857],{"__ignoreMap":25},[30,3803,3804,3806,3808,3810,3812,3814,3816,3819],{"class":32,"line":33},[30,3805,37],{"class":36},[30,3807,41],{"class":40},[30,3809,44],{"class":36},[30,3811,47],{"class":40},[30,3813,51],{"class":50},[30,3815,54],{"class":40},[30,3817,3818],{"class":36},"func",[30,3820,60],{"class":40},[30,3822,3823],{"class":32,"line":63},[30,3824,66],{"class":40},[30,3826,3827,3829,3831,3833,3835,3837,3839],{"class":32,"line":69},[30,3828,72],{"class":36},[30,3830,75],{"class":40},[30,3832,78],{"class":50},[30,3834,81],{"class":36},[30,3836,84],{"class":40},[30,3838,1272],{"class":87},[30,3840,91],{"class":40},[30,3842,3843,3845,3847,3849,3851,3854],{"class":32,"line":94},[30,3844,104],{"class":50},[30,3846,325],{"class":36},[30,3848,41],{"class":40},[30,3850,330],{"class":36},[30,3852,3853],{"class":40},"(v);",[30,3855,3856],{"class":97},"  \u002F\u002F ❌ 阻止了 RVO 优化！\n",[30,3858,3859],{"class":32,"line":101},[30,3860,116],{"class":40},[16,3862,3863,3864,3867],{},"正确做法：直接 ",[27,3865,3866],{},"return v;","，编译器会自动优化。",[16,3869,3870],{},[121,3871,3872],{},"错误 4：移动构造函数没有标记 noexcept",[20,3874,3876],{"className":22,"code":3875,"language":24,"meta":25,"style":25},"MyClass(MyClass&& other) { ... }  \u002F\u002F 缺少 noexcept\n",[27,3877,3878],{"__ignoreMap":25},[30,3879,3880,3883,3886,3888,3891],{"class":32,"line":33},[30,3881,3882],{"class":36},"MyClass",[30,3884,3885],{"class":40},"(MyClass",[30,3887,248],{"class":50},[30,3889,3890],{"class":40}," other) { ... }",[30,3892,3893],{"class":97},"  \u002F\u002F 缺少 noexcept\n",[16,3895,3896,3897,3900],{},"正确做法：",[27,3898,3899],{},"MyClass(MyClass&& other) noexcept { ... }"," — 不标记 noexcept 会导致 vector 等容器在扩容时退化为拷贝。",[12,3902,3903],{"id":3903},"使用建议",[1463,3905,3906,3912,3925,3931,3939],{},[132,3907,3908,3911],{},[121,3909,3910],{},"return 时不要加 std::move","：让编译器自动优化（RVO\u002FNRVO）。",[132,3913,3914,3920,3921,3924],{},[121,3915,3916,3917],{},"赋值给已有对象时用 ",[27,3918,3919],{},"std::move(source)","：用 ",[27,3922,3923],{},"target = std::move(source)"," 避免拷贝。",[132,3926,3927,3930],{},[121,3928,3929],{},"move 后不要再用源对象","（除非重新赋值或重置）。",[132,3932,3933,3938],{},[121,3934,3935,3936],{},"移动构造函数必须标记 ",[27,3937,1928],{},"：否则 STL 容器在扩容时不会调用它。",[132,3940,3941,3946],{},[121,3942,3943,3945],{},[27,3944,182],{}," 不移动任何东西","：它只是类型转换，把左值变成右值引用。真正的移动发生在移动构造函数或移动赋值运算符中。",[12,3948,3949],{"id":3949},"小结",[129,3951,3952,3955,3960,3963,3968,3971],{},[132,3953,3954],{},"左值有名字、可取地址；右值是临时的（字面量、临时对象）。",[132,3956,165,3957,3959],{},[27,3958,168],{}," 绑定到右值。",[132,3961,3962],{},"移动语义\"偷\"右值的资源，避免深拷贝。",[132,3964,3965,3967],{},[27,3966,160],{}," 把左值转为右值，告诉编译器\"x 可以被偷\"。",[132,3969,3970],{},"return 局部变量时不要加 std::move（让编译器自己优化）。",[132,3972,3935,3973,145],{},[27,3974,1928],{},[443,3976,3977],{"id":3977},"工程拓展",[16,3979,3980],{},"在 ROS2 中，发布消息、传输大量传感器数据（如点云、图像）时，移动语义能避免大数据拷贝。在 Boost.Asio 中，异步操作的回调参数大量使用移动语义来高效传递数据缓冲区。",[3982,3983,3984],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}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 .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 .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":25,"searchDepth":63,"depth":63,"links":3986},[3987,3988,3989,3990,3991,3992,3993,3998,3999,4000,4001,4002,4003],{"id":14,"depth":63,"text":14},{"id":127,"depth":63,"text":127},{"id":186,"depth":63,"text":187},{"id":193,"depth":63,"text":193},{"id":213,"depth":63,"text":213},{"id":339,"depth":63,"text":340},{"id":441,"depth":63,"text":441,"children":3994},[3995,3996,3997],{"id":445,"depth":69,"text":446},{"id":793,"depth":69,"text":794},{"id":2951,"depth":69,"text":2952},{"id":3388,"depth":63,"text":3388},{"id":3479,"depth":63,"text":3480},{"id":3561,"depth":63,"text":3562},{"id":3646,"depth":63,"text":3646},{"id":3903,"depth":63,"text":3903},{"id":3949,"depth":63,"text":3949,"children":4004},[4005],{"id":3977,"depth":69,"text":3977},"2000-1000","2023-10-05","2023-10-05-cplusplus-jiao-xue","\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue","Cplusplus教学","md",false,{},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi",{"title":5,"description":25},"wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1000-右值引用和移动语义","kVDacAq77lj7xgITERjrFmgUWyw7xrh796UlTgQoGkk",[4019,4026,4032,4038,4044,4050,4056,4062,4068,4074,4079,4085,4091,4097,4103,4109,4115,4121,4127,4133,4139,4145,4151,4157,4163,4169,4175,4181,4187,4193,4199,4205,4211,4217,4223,4229,4235,4241,4247,4253,4259,4264,4270,4276,4282,4288,4294,4300,4306,4308,4314,4320,4326,4332,4338,4344,4350,4356,4362,4368,4374,4380,4386,4392,4398,4404,4410,4416,4422,4428,4434,4440,4446,4452,4458,4464,4470,4476,4482,4488,4494,4500,4506,4512,4518,4524,4530,4536,4542,4548,4554,4560],{"path":4020,"stem":4021,"title":4022,"authors":4023,"date":4007,"chapterOrder":4024,"chapterDepth":4025,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0100-c-kai-fa-huan-jing-da-jian-yu-ce-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F0100-C++开发环境搭建与测试","C++开发环境搭建与测试",[7],"0100",0,{"path":4027,"stem":4028,"title":4029,"authors":4030,"date":4007,"chapterOrder":4031,"chapterDepth":4025,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0200-c-ji-chu-chu-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F0200-C++基础初识","C++基础初识",[7],"0200",{"path":4033,"stem":4034,"title":4035,"authors":4036,"date":4007,"chapterOrder":4037,"chapterDepth":4025,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0300-shu-ju-lei-xing-yu-shu-ju-cun-fang","wiki\u002F2023-10-05-Cplusplus教学\u002F0300-数据类型与数据存放","数据类型与数据存放",[7],"0300",{"path":4039,"stem":4040,"title":4041,"authors":4042,"date":4007,"chapterOrder":4043,"chapterDepth":4025,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0400-shu-ru-shu-chu","wiki\u002F2023-10-05-Cplusplus教学\u002F0400-输入输出","输入输出",[7],"0400",{"path":4045,"stem":4046,"title":4047,"authors":4048,"date":4007,"chapterOrder":4049,"chapterDepth":4025,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0500-yun-suan-fu","wiki\u002F2023-10-05-Cplusplus教学\u002F0500-运算符","运算符",[7],"0500",{"path":4051,"stem":4052,"title":4053,"authors":4054,"date":4007,"chapterOrder":4055,"chapterDepth":4025,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0600-cheng-xu-liu-cheng-jie-gou","wiki\u002F2023-10-05-Cplusplus教学\u002F0600-程序流程结构","程序流程结构",[7],"0600",{"path":4057,"stem":4058,"title":4059,"authors":4060,"date":4007,"chapterOrder":4061,"chapterDepth":4025,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0700-shu-zu","wiki\u002F2023-10-05-Cplusplus教学\u002F0700-数组","数组",[7],"0700",{"path":4063,"stem":4064,"title":4065,"authors":4066,"date":4007,"chapterOrder":4067,"chapterDepth":4025,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0800-han-shu-yu-tou-wen-jian","wiki\u002F2023-10-05-Cplusplus教学\u002F0800-函数与头文件","函数与头文件",[7],"0800",{"path":4069,"stem":4070,"title":4071,"authors":4072,"date":4007,"chapterOrder":4073,"chapterDepth":4025,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0900-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F0900-指针","指针",[7],"0900",{"path":4075,"stem":4076,"title":4077,"authors":4078,"date":4007,"chapterOrder":1272,"chapterDepth":4025,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1000-jie-gou-ti-yu-gong-yong-ti","wiki\u002F2023-10-05-Cplusplus教学\u002F1000-结构体与共用体","结构体与共用体",[7],{"path":4080,"stem":4081,"title":4082,"authors":4083,"date":4007,"chapterOrder":4084,"chapterDepth":4025,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1100-nei-cun-fen-qu-yu-sheng-ming-zhou-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1100-内存分区与生命周期","内存分区与生命周期",[7],"1100",{"path":4086,"stem":4087,"title":4088,"authors":4089,"date":4007,"chapterOrder":4090,"chapterDepth":4025,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1200-yin-yong","wiki\u002F2023-10-05-Cplusplus教学\u002F1200-引用","引用",[7],"1200",{"path":4092,"stem":4093,"title":4094,"authors":4095,"date":4007,"chapterOrder":4096,"chapterDepth":4025,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1300-han-shu-ti-gao","wiki\u002F2023-10-05-Cplusplus教学\u002F1300-函数提高","函数提高",[7],"1300",{"path":4098,"stem":4099,"title":4100,"authors":4101,"date":4007,"chapterOrder":4102,"chapterDepth":4025,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1350-ming-ming-kong-jian","wiki\u002F2023-10-05-Cplusplus教学\u002F1350-命名空间","命名空间",[7],"1350",{"path":4104,"stem":4105,"title":4106,"authors":4107,"date":4007,"chapterOrder":4108,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0100-feng-zhuang","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0100-封装","封装",[7],"1400-0100",{"path":4110,"stem":4111,"title":4112,"authors":4113,"date":4007,"chapterOrder":4114,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0200-dui-xiang-chu-shi-hua-he-qing-li","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0200-对象初始化和清理","对象初始化和清理",[7],"1400-0200",{"path":4116,"stem":4117,"title":4118,"authors":4119,"date":4007,"chapterOrder":4120,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0300-dui-xiang-mo-xing-yu-this-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0300-对象模型与this指针","对象模型与this指针",[7],"1400-0300",{"path":4122,"stem":4123,"title":4124,"authors":4125,"date":4007,"chapterOrder":4126,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0400-you-yuan-yu-yun-suan-fu-zhong-zai","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0400-友元与运算符重载","友元与运算符重载",[7],"1400-0400",{"path":4128,"stem":4129,"title":4130,"authors":4131,"date":4007,"chapterOrder":4132,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0500-ji-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0500-继承","继承",[7],"1400-0500",{"path":4134,"stem":4135,"title":4136,"authors":4137,"date":4007,"chapterOrder":4138,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0600-duo-tai","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0600-多态","多态",[7],"1400-0600",{"path":4140,"stem":4141,"title":4142,"authors":4143,"date":4007,"chapterOrder":4144,"chapterDepth":4025,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-lei-he-dui-xiang","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-类和对象","类和对象",[7],"1400",{"path":4146,"stem":4147,"title":4148,"authors":4149,"date":4007,"chapterOrder":4150,"chapterDepth":4025,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1450-han-shu-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F1450-函数指针","函数指针",[7],"1450",{"path":4152,"stem":4153,"title":4154,"authors":4155,"date":4007,"chapterOrder":4156,"chapterDepth":4025,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1500-wen-jian-cao-zuo","wiki\u002F2023-10-05-Cplusplus教学\u002F1500-文件操作","文件操作",[7],"1500",{"path":4158,"stem":4159,"title":4160,"authors":4161,"date":4007,"chapterOrder":4162,"chapterDepth":4025,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1600-yi-chang-chu-li-yu-cuo-wu-ma","wiki\u002F2023-10-05-Cplusplus教学\u002F1600-异常处理与错误码","异常处理",[7],"1600",{"path":4164,"stem":4165,"title":4166,"authors":4167,"date":4007,"chapterOrder":4168,"chapterDepth":4025,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1700-mu-ban","wiki\u002F2023-10-05-Cplusplus教学\u002F1700-模板","模板",[7],"1700",{"path":4170,"stem":4171,"title":4172,"authors":4173,"date":4007,"chapterOrder":4174,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0100-stl-chu-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0100-STL初识","STL初识",[7],"1800-0100",{"path":4176,"stem":4177,"title":4178,"authors":4179,"date":4007,"chapterOrder":4180,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0200-std-array","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0200-std-array","std::array",[7],"1800-0200",{"path":4182,"stem":4183,"title":4184,"authors":4185,"date":4007,"chapterOrder":4186,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0300-string-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0300-string容器","string容器",[7],"1800-0300",{"path":4188,"stem":4189,"title":4190,"authors":4191,"date":4007,"chapterOrder":4192,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0400-vector-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0400-vector容器","vector 容器",[7],"1800-0400",{"path":4194,"stem":4195,"title":4196,"authors":4197,"date":4007,"chapterOrder":4198,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0500-deque-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0500-deque容器","deque 容器",[7],"1800-0500",{"path":4200,"stem":4201,"title":4202,"authors":4203,"date":4007,"chapterOrder":4204,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0600-stack-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0600-stack容器","stack 容器",[7],"1800-0600",{"path":4206,"stem":4207,"title":4208,"authors":4209,"date":4007,"chapterOrder":4210,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0700-queue-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0700-queue容器","queue 容器",[7],"1800-0700",{"path":4212,"stem":4213,"title":4214,"authors":4215,"date":4007,"chapterOrder":4216,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0800-list-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0800-list容器","list 容器",[7],"1800-0800",{"path":4218,"stem":4219,"title":4220,"authors":4221,"date":4007,"chapterOrder":4222,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0900-set-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0900-set容器","set \u002F multiset 容器",[7],"1800-0900",{"path":4224,"stem":4225,"title":4226,"authors":4227,"date":4007,"chapterOrder":4228,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1000-map-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-1000-map容器","map \u002F multimap 容器",[7],"1800-1000",{"path":4230,"stem":4231,"title":4232,"authors":4233,"date":4007,"chapterOrder":4234,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1100-han-shu-dui-xiang-yu-wei-ci","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-1100-函数对象与谓词","函数对象与谓词",[7],"1800-1100",{"path":4236,"stem":4237,"title":4238,"authors":4239,"date":4007,"chapterOrder":4240,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1200-chang-yong-suan-fa","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-1200-常用算法","常用算法",[7],"1800-1200",{"path":4242,"stem":4243,"title":4244,"authors":4245,"date":4007,"chapterOrder":4246,"chapterDepth":4025,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-stl-ti-gao-bian-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-STL提高编程","STL提高编程",[7],"1800",{"path":4248,"stem":4249,"title":4250,"authors":4251,"date":4007,"chapterOrder":4252,"chapterDepth":4025,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1900-c-lei-xing-zhuan-huan","wiki\u002F2023-10-05-Cplusplus教学\u002F1900-C++类型转换","C++类型转换",[7],"1900",{"path":4254,"stem":4255,"title":4256,"authors":4257,"date":4007,"chapterOrder":4258,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0100-auto","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0100-auto","auto",[7],"2000-0100",{"path":4260,"stem":4261,"title":2316,"authors":4262,"date":4007,"chapterOrder":4263,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0200-nullptr","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0200-nullptr",[7],"2000-0200",{"path":4265,"stem":4266,"title":4267,"authors":4268,"date":4007,"chapterOrder":4269,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0300-using","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0300-using","using",[7],"2000-0300",{"path":4271,"stem":4272,"title":4273,"authors":4274,"date":4007,"chapterOrder":4275,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0400-enum-class","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0400-enum-class","enum class",[7],"2000-0400",{"path":4277,"stem":4278,"title":4279,"authors":4280,"date":4007,"chapterOrder":4281,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0500-fan-wei-for-xun-huan","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0500-范围for循环","范围 for 循环",[7],"2000-0500",{"path":4283,"stem":4284,"title":4285,"authors":4286,"date":4007,"chapterOrder":4287,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0600-jie-gou-hua-bang-ding","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0600-结构化绑定","结构化绑定",[7],"2000-0600",{"path":4289,"stem":4290,"title":4291,"authors":4292,"date":4007,"chapterOrder":4293,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0700-constexpr","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0700-constexpr","constexpr",[7],"2000-0700",{"path":4295,"stem":4296,"title":4297,"authors":4298,"date":4007,"chapterOrder":4299,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0800-RAII","RAII",[7],"2000-0800",{"path":4301,"stem":4302,"title":4303,"authors":4304,"date":4007,"chapterOrder":4305,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0900-智能指针","智能指针",[7],"2000-0900",{"path":4014,"stem":4016,"title":5,"authors":4307,"date":4007,"chapterOrder":4006,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},[7],{"path":4309,"stem":4310,"title":4311,"authors":4312,"date":4007,"chapterOrder":4313,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1100-lambda-biao-da-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1100-Lambda表达式","Lambda 表达式",[7],"2000-1100",{"path":4315,"stem":4316,"title":4317,"authors":4318,"date":4007,"chapterOrder":4319,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1200-std-function","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1200-std-function","std::function",[7],"2000-1200",{"path":4321,"stem":4322,"title":4323,"authors":4324,"date":4007,"chapterOrder":4325,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1300-std-bind","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1300-std-bind","std::bind",[7],"2000-1300",{"path":4327,"stem":4328,"title":4329,"authors":4330,"date":4007,"chapterOrder":4331,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1400-std-optional","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1400-std-optional","std::optional",[7],"2000-1400",{"path":4333,"stem":4334,"title":4335,"authors":4336,"date":4007,"chapterOrder":4337,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1500-std-variant","std::variant",[7],"2000-1500",{"path":4339,"stem":4340,"title":4341,"authors":4342,"date":4007,"chapterOrder":4343,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1600-std-span","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1600-std-span","std::span",[7],"2000-1600",{"path":4345,"stem":4346,"title":4347,"authors":4348,"date":4007,"chapterOrder":4349,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1700-std-format-print","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1700-std-format-print","std::format \u002F std::print",[7],"2000-1700",{"path":4351,"stem":4352,"title":4353,"authors":4354,"date":4007,"chapterOrder":4355,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1800-std-chrono","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1800-std-chrono","std::chrono",[7],"2000-1800",{"path":4357,"stem":4358,"title":4359,"authors":4360,"date":4007,"chapterOrder":4361,"chapterDepth":63,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0100-bing-fa-shi-shen-me","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0100-并发是什么","并发是什么",[7],"2000-1900-0100",{"path":4363,"stem":4364,"title":4365,"authors":4366,"date":4007,"chapterOrder":4367,"chapterDepth":63,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0200-bing-xing-shi-shen-me","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0200-并行是什么","并行是什么",[7],"2000-1900-0200",{"path":4369,"stem":4370,"title":4371,"authors":4372,"date":4007,"chapterOrder":4373,"chapterDepth":63,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0300-xie-cheng-shi-shen-me","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0300-协程是什么","协程是什么",[7],"2000-1900-0300",{"path":4375,"stem":4376,"title":4377,"authors":4378,"date":4007,"chapterOrder":4379,"chapterDepth":63,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1000-bing-fa-bian-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1000-并发编程","并发编程",[7],"2000-1900-1000",{"path":4381,"stem":4382,"title":4383,"authors":4384,"date":4007,"chapterOrder":4385,"chapterDepth":63,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1100-std-thread","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1100-std-thread","std::thread",[7],"2000-1900-1100",{"path":4387,"stem":4388,"title":4389,"authors":4390,"date":4007,"chapterOrder":4391,"chapterDepth":63,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1200-mutex-lock-guard","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1200-mutex-lock-guard","mutex 与 RAII 锁",[7],"2000-1900-1200",{"path":4393,"stem":4394,"title":4395,"authors":4396,"date":4007,"chapterOrder":4397,"chapterDepth":63,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1300-std-atomic","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1300-std-atomic","std::atomic",[7],"2000-1900-1300",{"path":4399,"stem":4400,"title":4401,"authors":4402,"date":4007,"chapterOrder":4403,"chapterDepth":63,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1400-condition-variable","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1400-condition-variable","condition_variable",[7],"2000-1900-1400",{"path":4405,"stem":4406,"title":4407,"authors":4408,"date":4007,"chapterOrder":4409,"chapterDepth":63,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1500-future-async-promise","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1500-future-async-promise","future、async、promise 与 packaged_task",[7],"2000-1900-1500",{"path":4411,"stem":4412,"title":4413,"authors":4414,"date":4007,"chapterOrder":4415,"chapterDepth":63,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1600-jthread-stop-token","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1600-jthread-stop-token","jthread 与 stop_token",[7],"2000-1900-1600",{"path":4417,"stem":4418,"title":4419,"authors":4420,"date":4007,"chapterOrder":4421,"chapterDepth":63,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1700-semaphore-latch-barrier","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1700-semaphore-latch-barrier","semaphore、latch 与 barrier",[7],"2000-1900-1700",{"path":4423,"stem":4424,"title":4425,"authors":4426,"date":4007,"chapterOrder":4427,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-bing-fa-bing-xing-yu-xie-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-并发并行与协程","并发、并行与协程",[7],"2000-1900",{"path":4429,"stem":4430,"title":4431,"authors":4432,"date":4007,"chapterOrder":4433,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2000-std-filesystem","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-2000-std-filesystem","std::filesystem",[7],"2000-2000",{"path":4435,"stem":4436,"title":4437,"authors":4438,"date":4007,"chapterOrder":4439,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2100-modules-jian-jie","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-2100-modules简介","modules 简介",[7],"2000-2100",{"path":4441,"stem":4442,"title":4443,"authors":4444,"date":4007,"chapterOrder":4445,"chapterDepth":4025,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-xian-dai-c","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-现代C++","现代C++",[7],"2000",{"path":4447,"stem":4448,"title":4449,"authors":4450,"date":4007,"chapterOrder":4451,"chapterDepth":63,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0100-定时器与异步IO","定时器与异步 IO",[7],"2100-0100-0100",{"path":4453,"stem":4454,"title":4455,"authors":4456,"date":4007,"chapterOrder":4457,"chapterDepth":63,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0200-Boost.Asio基础","Boost.Asio 基础",[7],"2100-0100-0200",{"path":4459,"stem":4460,"title":4461,"authors":4462,"date":4007,"chapterOrder":4463,"chapterDepth":63,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0300-chuan-kou-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0300-串口通信","串口通信教学",[7],"2100-0100-0300",{"path":4465,"stem":4466,"title":4467,"authors":4468,"date":4007,"chapterOrder":4469,"chapterDepth":63,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0350-chuan-kou-tong-xin-chuan-kou-bao-xie-yi-shi-li","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0350-串口通信串口包协议实例","串口通信串口包协议实例",[7],"2100-0100-0350",{"path":4471,"stem":4472,"title":4473,"authors":4474,"date":4007,"chapterOrder":4475,"chapterDepth":63,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0400-TCP通信","TCP 通信",[7],"2100-0100-0400",{"path":4477,"stem":4478,"title":4479,"authors":4480,"date":4007,"chapterOrder":4481,"chapterDepth":63,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0500-udp-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0500-UDP通信","UDP 通信",[7],"2100-0100-0500",{"path":4483,"stem":4484,"title":4485,"authors":4486,"date":4007,"chapterOrder":4487,"chapterDepth":63,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0600-ji-qi-ren-gong-cheng-xie-fa-yu-ros2-ji-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0600-机器人工程写法与ROS2集成","机器人工程写法与 ROS2 集成",[7],"2100-0100-0600",{"path":4489,"stem":4490,"title":4491,"authors":4492,"date":4007,"chapterOrder":4493,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-boost-asio-yi-bu-io-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-Boost.Asio异步IO库","Boost.Asio异步IO库",[7],"2100-0100",{"path":4495,"stem":4496,"title":4497,"authors":4498,"date":4007,"chapterOrder":4499,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0200-eigen-xian-xing-dai-shu-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0200-Eigen线性代数库","Eigen线性代数库",[7],"2100-0200",{"path":4501,"stem":4502,"title":4503,"authors":4504,"date":4007,"chapterOrder":4505,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0300-opencv-ji-suan-ji-shi-jue-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0300-OpenCV计算机视觉库","OpenCV计算机视觉库",[7],"2100-0300",{"path":4507,"stem":4508,"title":4509,"authors":4510,"date":4007,"chapterOrder":4511,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0400-pcl-dian-yun-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0400-PCL点云库","PCL点云库",[7],"2100-0400",{"path":4513,"stem":4514,"title":4515,"authors":4516,"date":4007,"chapterOrder":4517,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0500-sophus-li-qun-li-dai-shu-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0500-Sophus李群李代数库","Sophus 李群李代数库",[7],"2100-0500",{"path":4519,"stem":4520,"title":4521,"authors":4522,"date":4007,"chapterOrder":4523,"chapterDepth":4025,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-chang-yong-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-常用库","常用库学习",[7],"2100",{"path":4525,"stem":4526,"title":4527,"authors":4528,"date":4007,"chapterOrder":4529,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0100-cmakepresets-yu-gou-jian-an-zhuang","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0100-CMakePresets与构建安装","CMakePresets与构建安装",[7],"2200-0100",{"path":4531,"stem":4532,"title":4533,"authors":4534,"date":4007,"chapterOrder":4535,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0200-ding-ceng-cmake-yu-gong-gong-bian-yi-xuan-xiang","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0200-顶层CMake与公共编译选项","顶层CMake与公共编译选项",[7],"2200-0200",{"path":4537,"stem":4538,"title":4539,"authors":4540,"date":4007,"chapterOrder":4541,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0300-src与lib模块CMake详解","src与lib模块CMake详解",[7],"2200-0300",{"path":4543,"stem":4544,"title":4545,"authors":4546,"date":4007,"chapterOrder":4547,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0400-di-san-fang-ku-yi-lai-xie-fa","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0400-第三方库依赖写法","第三方库依赖写法",[7],"2200-0400",{"path":4549,"stem":4550,"title":4551,"authors":4552,"date":4007,"chapterOrder":4553,"chapterDepth":33,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0500-mu-ban-kuo-zhan-yu-chang-jian-wen-ti","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0500-模板扩展与常见问题","模板扩展与常见问题",[7],"2200-0500",{"path":4555,"stem":4556,"title":4557,"authors":4558,"date":4007,"chapterOrder":4559,"chapterDepth":4025,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":4012},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-cmake-gong-cheng-mu-ban","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-CMake工程模板","CMake工程模板",[7],"2200",{"path":4009,"stem":4561,"title":4562,"authors":4563,"date":4007,"chapterOrder":4564,"chapterDepth":4025,"docKey":4008,"docRoot":4009,"docTitle":4010,"isWikiDoc":270,"isWikiIndex":270},"wiki\u002F2023-10-05-Cplusplus教学\u002Findex","C\u002FC++教程",[7],null,[4566,4568,4571,4574],{"name":7,"image":4567},"\u002Fimages\u002Fmember_photo\u002F董佳辉.jpg",{"name":4569,"image":4570},"宫金良","\u002Fimages\u002Fmember_photo\u002F宫金良.jpg",{"name":4572,"image":4573},"巩丽","\u002Fimages\u002Fmember_photo\u002F巩丽.png",{"name":4575,"image":4576},"张彦斐","\u002Fimages\u002Fmember_photo\u002F张彦斐.jpg",1792431898376]