[{"data":1,"prerenderedAt":2966},["ShallowReactive",2],{"wiki-page-/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-10-you-zhi-yin-yong-he-yi-dong-yu-yi":3,"wiki-doc-items-/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-10-you-zhi-yin-yong-he-yi-dong-yu-yi":2541,"language-switcher-data-/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-10-you-zhi-yin-yong-he-yi-dong-yu-yi":2950,"wiki-i18n-paths-/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-10-you-zhi-yin-yong-he-yi-dong-yu-yi":2965},{"id":4,"title":5,"body":6,"canonicalPath":2523,"chapter":2524,"chapterSort":2525,"date":2526,"description":23,"docI18nKey":2527,"docKey":2528,"docRoot":2529,"docTitle":2530,"extension":2531,"i18nKey":2532,"isBlogPost":2533,"isWikiDoc":268,"isWikiIndex":2533,"layout":2534,"legacyPath":2535,"locale":2536,"localeSlug":2537,"meta":2538,"navigation":268,"path":2523,"seo":2539,"sourcePath":2535,"sourceStem":2532,"stem":2532,"wikiDepth":31,"__hash__":2540},"content/wiki/2023-10-05-Cplusplus教学/ch18-10-右值引用和移动语义.md","右值引用和移动语义",{"type":7,"value":8,"toc":2501},"minimark",[9,13,17,115,123,126,182,186,189,192,209,212,335,339,437,440,445,775,781,789,793,1436,1440,1446,1450,1882,1886,1892,1894,1897,1900,1989,1993,2005,2057,2071,2075,2157,2160,2165,2239,2242,2247,2304,2307,2312,2376,2383,2388,2409,2416,2419,2463,2466,2491,2494,2497],[10,11,12],"h2",{"id":12},"本节解决什么问题",[14,15,16],"p",{},"考虑这样的场景：",[18,19,24],"pre",{"className":20,"code":21,"language":22,"meta":23,"style":23},"language-cpp shiki shiki-themes github-light github-dark","std::vector\u003Cint> create_large_vector()\n{\n    std::vector\u003Cint> v(1000000);\n    // ... 填充数据 ...\n    return v;  // C++98 中会拷贝整个 vector！（非常慢）\n}\n","cpp","",[25,26,27,59,65,90,97,109],"code",{"__ignoreMap":23},[28,29,32,36,40,43,46,50,53,56],"span",{"class":30,"line":31},"line",1,[28,33,35],{"class":34},"sScJk","std",[28,37,39],{"class":38},"sVt8B","::",[28,41,42],{"class":34},"vector",[28,44,45],{"class":38},"\u003C",[28,47,49],{"class":48},"szBVR","int",[28,51,52],{"class":38},"> ",[28,54,55],{"class":34},"create_large_vector",[28,57,58],{"class":38},"()\n",[28,60,62],{"class":30,"line":61},2,[28,63,64],{"class":38},"{\n",[28,66,68,71,74,77,80,83,87],{"class":30,"line":67},3,[28,69,70],{"class":34},"    std",[28,72,73],{"class":38},"::vector",[28,75,76],{"class":48},"\u003Cint>",[28,78,79],{"class":34}," v",[28,81,82],{"class":38},"(",[28,84,86],{"class":85},"sj4cs","1000000",[28,88,89],{"class":38},");\n",[28,91,93],{"class":30,"line":92},4,[28,94,96],{"class":95},"sJ8bj","    // ... 填充数据 ...\n",[28,98,100,103,106],{"class":30,"line":99},5,[28,101,102],{"class":48},"    return",[28,104,105],{"class":38}," v;",[28,107,108],{"class":95},"  // C++98 中会拷贝整个 vector！（非常慢）\n",[28,110,112],{"class":30,"line":111},6,[28,113,114],{"class":38},"}\n",[14,116,117,118,122],{},"在 C++98 中，函数返回大的对象时会发生",[119,120,121],"strong",{},"深拷贝","，性能很差。C++11 引入了移动语义，把\"拷贝别人的数据\"变成\"偷走别人的数据\"，大幅提高性能。",[10,124,125],{"id":125},"这个特性是什么",[127,128,129,144,159,168,174],"ul",{},[130,131,132,135,136,139,140,143],"li",{},[119,133,134],{},"左值","：有名字、可以取地址的对象。如变量 ",[25,137,138],{},"x","、",[25,141,142],{},"arr[0]","。",[130,145,146,149,150,139,153,139,156,143],{},[119,147,148],{},"右值","：临时的、即将销毁的对象。如 ",[25,151,152],{},"42",[25,154,155],{},"x + y",[25,157,158],{},"std::move(x)",[130,160,161,167],{},[119,162,163,164],{},"右值引用 ",[25,165,166],{},"T&&","：绑定到右值的引用。",[130,169,170,173],{},[119,171,172],{},"移动语义","：通过\"偷\"右值的资源而不是拷贝，来避免不必要的深拷贝。",[130,175,176,181],{},[119,177,178],{},[25,179,180],{},"std::move","：将左值转为右值引用，告诉编译器\"这个对象我以后不再用了，你可以偷它的资源\"。",[10,183,185],{"id":184},"c-标准版本","C++ 标准版本",[14,187,188],{},"C++11",[10,190,191],{"id":191},"需要的头文件",[18,193,195],{"className":20,"code":194,"language":22,"meta":23,"style":23},"#include \u003Cutility>  // for std::move, std::forward\n",[25,196,197],{"__ignoreMap":23},[28,198,199,202,206],{"class":30,"line":31},[28,200,201],{"class":48},"#include",[28,203,205],{"class":204},"sZZnC"," \u003Cutility>",[28,207,208],{"class":95},"  // for std::move, std::forward\n",[10,210,211],{"id":211},"基本语法",[18,213,215],{"className":20,"code":214,"language":22,"meta":23,"style":23},"int&& rref = 42;           // 右值引用绑定到临时值\nstd::string&& sr = s1 + s2;  // 绑定到表达式结果\n\n// std::move：把左值转为右值\nstd::vector\u003Cint> v1 = {1, 2, 3};\nstd::vector\u003Cint> v2 = std::move(v1);  // v1 的数据被\"偷\"到 v2，v1 变成空\n",[25,216,217,237,264,270,275,308],{"__ignoreMap":23},[28,218,219,222,225,228,231,234],{"class":30,"line":31},[28,220,221],{"class":48},"int&&",[28,223,224],{"class":38}," rref ",[28,226,227],{"class":48},"=",[28,229,230],{"class":85}," 42",[28,232,233],{"class":38},";",[28,235,236],{"class":95},"           // 右值引用绑定到临时值\n",[28,238,239,241,244,247,250,252,255,258,261],{"class":30,"line":61},[28,240,35],{"class":34},[28,242,243],{"class":38},"::string",[28,245,246],{"class":48},"&&",[28,248,249],{"class":38}," sr ",[28,251,227],{"class":48},[28,253,254],{"class":38}," s1 ",[28,256,257],{"class":48},"+",[28,259,260],{"class":38}," s2;",[28,262,263],{"class":95},"  // 绑定到表达式结果\n",[28,265,266],{"class":30,"line":67},[28,267,269],{"emptyLinePlaceholder":268},true,"\n",[28,271,272],{"class":30,"line":92},[28,273,274],{"class":95},"// std::move：把左值转为右值\n",[28,276,277,279,281,283,286,288,291,294,297,300,302,305],{"class":30,"line":99},[28,278,35],{"class":34},[28,280,73],{"class":38},[28,282,76],{"class":48},[28,284,285],{"class":38}," v1 ",[28,287,227],{"class":48},[28,289,290],{"class":38}," {",[28,292,293],{"class":85},"1",[28,295,296],{"class":38},", ",[28,298,299],{"class":85},"2",[28,301,296],{"class":38},[28,303,304],{"class":85},"3",[28,306,307],{"class":38},"};\n",[28,309,310,312,314,316,319,321,324,326,329,332],{"class":30,"line":111},[28,311,35],{"class":34},[28,313,73],{"class":38},[28,315,76],{"class":48},[28,317,318],{"class":38}," v2 ",[28,320,227],{"class":48},[28,322,323],{"class":34}," std",[28,325,39],{"class":38},[28,327,328],{"class":34},"move",[28,330,331],{"class":38},"(v1);",[28,333,334],{"class":95},"  // v1 的数据被\"偷\"到 v2，v1 变成空\n",[10,336,338],{"id":337},"左值-vs-右值速查表","左值 vs 右值速查表",[340,341,342,359],"table",{},[343,344,345],"thead",{},[346,347,348,353,356],"tr",{},[349,350,352],"th",{"align":351},"left","表达式",[349,354,355],{"align":351},"左值/右值",[349,357,358],{"align":351},"说明",[360,361,362,378,389,400,413,425],"tbody",{},[346,363,364,370,375],{},[365,366,367],"td",{"align":351},[25,368,369],{},"int x = 5;",[365,371,372,374],{"align":351},[25,373,138],{}," 是左值",[365,376,377],{"align":351},"有名字，可取地址",[346,379,380,384,386],{},[365,381,382],{"align":351},[25,383,152],{},[365,385,148],{"align":351},[365,387,388],{"align":351},"字面量",[346,390,391,395,397],{},[365,392,393],{"align":351},[25,394,155],{},[365,396,148],{"align":351},[365,398,399],{"align":351},"临时结果",[346,401,402,408,410],{},[365,403,404,407],{"align":351},[25,405,406],{},"f()"," 返回非引用",[365,409,148],{"align":351},[365,411,412],{"align":351},"临时对象",[346,414,415,420,422],{},[365,416,417,419],{"align":351},[25,418,406],{}," 返回引用",[365,421,134],{"align":351},[365,423,424],{"align":351},"引用是别名",[346,426,427,431,434],{},[365,428,429],{"align":351},[25,430,158],{},[365,432,433],{"align":351},"右值（将亡值）",[365,435,436],{"align":351},"强制转为右值引用",[10,438,439],{"id":439},"示例代码",[441,442,444],"h3",{"id":443},"示例-1拷贝-vs-移动为什么需要移动语义","示例 1：拷贝 vs 移动——为什么需要移动语义",[18,446,448],{"className":20,"code":447,"language":22,"meta":23,"style":23},"#include \u003Ciostream>\n#include \u003Cvector>\n\nint main()\n{\n    std::vector\u003Cint> v1 = {1, 2, 3, 4, 5};\n\n    // 拷贝（两份独立的数据）\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\";  // 5\n    std::cout \u003C\u003C \"  v2 size = \" \u003C\u003C v2.size() \u003C\u003C \"\\n\";  // 5\n\n    // 移动（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\";  // 0\n    std::cout \u003C\u003C \"  v3 size = \" \u003C\u003C v3.size() \u003C\u003C \"\\n\";  // 5\n\n    return 0;\n}\n",[25,449,450,457,464,468,477,481,517,522,528,544,567,605,638,643,649,672,690,722,755,760,770],{"__ignoreMap":23},[28,451,452,454],{"class":30,"line":31},[28,453,201],{"class":48},[28,455,456],{"class":204}," \u003Ciostream>\n",[28,458,459,461],{"class":30,"line":61},[28,460,201],{"class":48},[28,462,463],{"class":204}," \u003Cvector>\n",[28,465,466],{"class":30,"line":67},[28,467,269],{"emptyLinePlaceholder":268},[28,469,470,472,475],{"class":30,"line":92},[28,471,49],{"class":48},[28,473,474],{"class":34}," main",[28,476,58],{"class":38},[28,478,479],{"class":30,"line":99},[28,480,64],{"class":38},[28,482,483,485,487,489,491,493,495,497,499,501,503,505,507,510,512,515],{"class":30,"line":111},[28,484,70],{"class":34},[28,486,73],{"class":38},[28,488,76],{"class":48},[28,490,285],{"class":38},[28,492,227],{"class":48},[28,494,290],{"class":38},[28,496,293],{"class":85},[28,498,296],{"class":38},[28,500,299],{"class":85},[28,502,296],{"class":38},[28,504,304],{"class":85},[28,506,296],{"class":38},[28,508,509],{"class":85},"4",[28,511,296],{"class":38},[28,513,514],{"class":85},"5",[28,516,307],{"class":38},[28,518,520],{"class":30,"line":519},7,[28,521,269],{"emptyLinePlaceholder":268},[28,523,525],{"class":30,"line":524},8,[28,526,527],{"class":95},"    // 拷贝（两份独立的数据）\n",[28,529,531,533,535,537,539,541],{"class":30,"line":530},9,[28,532,70],{"class":34},[28,534,73],{"class":38},[28,536,76],{"class":48},[28,538,318],{"class":38},[28,540,227],{"class":48},[28,542,543],{"class":38}," v1;\n",[28,545,547,549,552,555,558,561,564],{"class":30,"line":546},10,[28,548,70],{"class":34},[28,550,551],{"class":38},"::cout ",[28,553,554],{"class":48},"\u003C\u003C",[28,556,557],{"class":204}," \"after copy:",[28,559,560],{"class":85},"\\n",[28,562,563],{"class":204},"\"",[28,565,566],{"class":38},";\n",[28,568,570,572,574,576,579,582,585,588,591,593,596,598,600,602],{"class":30,"line":569},11,[28,571,70],{"class":34},[28,573,551],{"class":38},[28,575,554],{"class":48},[28,577,578],{"class":204}," \"  v1 size = \"",[28,580,581],{"class":48}," \u003C\u003C",[28,583,584],{"class":38}," v1.",[28,586,587],{"class":34},"size",[28,589,590],{"class":38},"() ",[28,592,554],{"class":48},[28,594,595],{"class":204}," \"",[28,597,560],{"class":85},[28,599,563],{"class":204},[28,601,233],{"class":38},[28,603,604],{"class":95},"  // 5\n",[28,606,608,610,612,614,617,619,622,624,626,628,630,632,634,636],{"class":30,"line":607},12,[28,609,70],{"class":34},[28,611,551],{"class":38},[28,613,554],{"class":48},[28,615,616],{"class":204}," \"  v2 size = \"",[28,618,581],{"class":48},[28,620,621],{"class":38}," v2.",[28,623,587],{"class":34},[28,625,590],{"class":38},[28,627,554],{"class":48},[28,629,595],{"class":204},[28,631,560],{"class":85},[28,633,563],{"class":204},[28,635,233],{"class":38},[28,637,604],{"class":95},[28,639,641],{"class":30,"line":640},13,[28,642,269],{"emptyLinePlaceholder":268},[28,644,646],{"class":30,"line":645},14,[28,647,648],{"class":95},"    // 移动（v1 的数据被\"偷\"到 v3，v1 变成空）\n",[28,650,652,654,656,658,661,663,665,667,669],{"class":30,"line":651},15,[28,653,70],{"class":34},[28,655,73],{"class":38},[28,657,76],{"class":48},[28,659,660],{"class":38}," v3 ",[28,662,227],{"class":48},[28,664,323],{"class":34},[28,666,39],{"class":38},[28,668,328],{"class":34},[28,670,671],{"class":38},"(v1);\n",[28,673,675,677,679,681,684,686,688],{"class":30,"line":674},16,[28,676,70],{"class":34},[28,678,551],{"class":38},[28,680,554],{"class":48},[28,682,683],{"class":204}," \"after move:",[28,685,560],{"class":85},[28,687,563],{"class":204},[28,689,566],{"class":38},[28,691,693,695,697,699,701,703,705,707,709,711,713,715,717,719],{"class":30,"line":692},17,[28,694,70],{"class":34},[28,696,551],{"class":38},[28,698,554],{"class":48},[28,700,578],{"class":204},[28,702,581],{"class":48},[28,704,584],{"class":38},[28,706,587],{"class":34},[28,708,590],{"class":38},[28,710,554],{"class":48},[28,712,595],{"class":204},[28,714,560],{"class":85},[28,716,563],{"class":204},[28,718,233],{"class":38},[28,720,721],{"class":95},"  // 0\n",[28,723,725,727,729,731,734,736,739,741,743,745,747,749,751,753],{"class":30,"line":724},18,[28,726,70],{"class":34},[28,728,551],{"class":38},[28,730,554],{"class":48},[28,732,733],{"class":204}," \"  v3 size = \"",[28,735,581],{"class":48},[28,737,738],{"class":38}," v3.",[28,740,587],{"class":34},[28,742,590],{"class":38},[28,744,554],{"class":48},[28,746,595],{"class":204},[28,748,560],{"class":85},[28,750,563],{"class":204},[28,752,233],{"class":38},[28,754,604],{"class":95},[28,756,758],{"class":30,"line":757},19,[28,759,269],{"emptyLinePlaceholder":268},[28,761,763,765,768],{"class":30,"line":762},20,[28,764,102],{"class":48},[28,766,767],{"class":85}," 0",[28,769,566],{"class":38},[28,771,773],{"class":30,"line":772},21,[28,774,114],{"class":38},[14,776,777,780],{},[119,778,779],{},"运行结果","：",[18,782,787],{"className":783,"code":785,"language":786},[784],"language-text","after copy:\n  v1 size = 5\n  v2 size = 5\nafter move:\n  v1 size = 0\n  v3 size = 5\n","text",[25,788,785],{"__ignoreMap":23},[441,790,792],{"id":791},"示例-2在示例-1-基础上自定义类的移动构造函数","示例 2：在示例 1 基础上，自定义类的移动构造函数",[18,794,796],{"className":20,"code":795,"language":22,"meta":23,"style":23},"#include \u003Calgorithm> // for std::copy\n#include \u003Ciostream>\n#include \u003Cstring>\n#include \u003Cutility>  // for std::move\n\nclass Buffer\n{\n    int* data;\n    size_t size;\n\npublic:\n    // 构造函数\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    // 拷贝构造函数（深拷贝）\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    // 移动构造函数（偷数据）\n    Buffer(Buffer&& other) noexcept\n        : data(other.data), size(other.size)\n    {\n        other.data = nullptr;  // 让原对象安全析构\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    // 拷贝：会触发深拷贝\n    Buffer buf2 = buf1;\n    std::cout \u003C\u003C \"buf1 size after copy: \" \u003C\u003C buf1.get_size() \u003C\u003C \"\\n\";\n\n    // 移动：数据被偷走，没有深拷贝！\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",[25,797,798,808,814,821,830,834,842,846,854,862,866,871,876,912,917,945,950,954,959,995,999,1016,1043,1048,1053,1059,1079,1094,1099,1115,1127,1153,1158,1163,1171,1176,1184,1202,1207,1212,1233,1238,1243,1252,1257,1273,1278,1284,1295,1327,1332,1338,1355,1386,1417,1422,1431],{"__ignoreMap":23},[28,799,800,802,805],{"class":30,"line":31},[28,801,201],{"class":48},[28,803,804],{"class":204}," \u003Calgorithm>",[28,806,807],{"class":95}," // for std::copy\n",[28,809,810,812],{"class":30,"line":61},[28,811,201],{"class":48},[28,813,456],{"class":204},[28,815,816,818],{"class":30,"line":67},[28,817,201],{"class":48},[28,819,820],{"class":204}," \u003Cstring>\n",[28,822,823,825,827],{"class":30,"line":92},[28,824,201],{"class":48},[28,826,205],{"class":204},[28,828,829],{"class":95},"  // for std::move\n",[28,831,832],{"class":30,"line":99},[28,833,269],{"emptyLinePlaceholder":268},[28,835,836,839],{"class":30,"line":111},[28,837,838],{"class":48},"class",[28,840,841],{"class":34}," Buffer\n",[28,843,844],{"class":30,"line":519},[28,845,64],{"class":38},[28,847,848,851],{"class":30,"line":524},[28,849,850],{"class":48},"    int*",[28,852,853],{"class":38}," data;\n",[28,855,856,859],{"class":30,"line":530},[28,857,858],{"class":48},"    size_t",[28,860,861],{"class":38}," size;\n",[28,863,864],{"class":30,"line":546},[28,865,269],{"emptyLinePlaceholder":268},[28,867,868],{"class":30,"line":569},[28,869,870],{"class":48},"public:\n",[28,872,873],{"class":30,"line":607},[28,874,875],{"class":95},"    // 构造函数\n",[28,877,878,881,883,886,890,893,896,898,901,904,907,909],{"class":30,"line":640},[28,879,880],{"class":34},"    Buffer",[28,882,82],{"class":38},[28,884,885],{"class":48},"size_t",[28,887,889],{"class":888},"s4XuR"," n",[28,891,892],{"class":38},") : ",[28,894,895],{"class":34},"data",[28,897,82],{"class":38},[28,899,900],{"class":48},"new",[28,902,903],{"class":48}," int",[28,905,906],{"class":38},"[n]), ",[28,908,587],{"class":34},[28,910,911],{"class":38},"(n)\n",[28,913,914],{"class":30,"line":645},[28,915,916],{"class":38},"    {\n",[28,918,919,922,924,926,929,931,934,936,939,941,943],{"class":30,"line":651},[28,920,921],{"class":34},"        std",[28,923,551],{"class":38},[28,925,554],{"class":48},[28,927,928],{"class":204}," \"Constructor: allocated \"",[28,930,581],{"class":48},[28,932,933],{"class":38}," n ",[28,935,554],{"class":48},[28,937,938],{"class":204}," \" ints",[28,940,560],{"class":85},[28,942,563],{"class":204},[28,944,566],{"class":38},[28,946,947],{"class":30,"line":674},[28,948,949],{"class":38},"    }\n",[28,951,952],{"class":30,"line":692},[28,953,269],{"emptyLinePlaceholder":268},[28,955,956],{"class":30,"line":724},[28,957,958],{"class":95},"    // 拷贝构造函数（深拷贝）\n",[28,960,961,963,965,968,971,974,977,979,981,983,985,987,990,992],{"class":30,"line":757},[28,962,880],{"class":34},[28,964,82],{"class":38},[28,966,967],{"class":48},"const",[28,969,970],{"class":34}," Buffer",[28,972,973],{"class":48},"&",[28,975,976],{"class":888}," other",[28,978,892],{"class":38},[28,980,895],{"class":34},[28,982,82],{"class":38},[28,984,900],{"class":48},[28,986,903],{"class":48},[28,988,989],{"class":38},"[other.size]), ",[28,991,587],{"class":34},[28,993,994],{"class":38},"(other.size)\n",[28,996,997],{"class":30,"line":762},[28,998,916],{"class":38},[28,1000,1001,1003,1005,1008,1011,1013],{"class":30,"line":772},[28,1002,921],{"class":34},[28,1004,39],{"class":38},[28,1006,1007],{"class":34},"copy",[28,1009,1010],{"class":38},"(other.data, other.data ",[28,1012,257],{"class":48},[28,1014,1015],{"class":38}," size, data);\n",[28,1017,1019,1021,1023,1025,1028,1030,1033,1035,1037,1039,1041],{"class":30,"line":1018},22,[28,1020,921],{"class":34},[28,1022,551],{"class":38},[28,1024,554],{"class":48},[28,1026,1027],{"class":204}," \"Copy constructor: deep copied \"",[28,1029,581],{"class":48},[28,1031,1032],{"class":38}," size ",[28,1034,554],{"class":48},[28,1036,938],{"class":204},[28,1038,560],{"class":85},[28,1040,563],{"class":204},[28,1042,566],{"class":38},[28,1044,1046],{"class":30,"line":1045},23,[28,1047,949],{"class":38},[28,1049,1051],{"class":30,"line":1050},24,[28,1052,269],{"emptyLinePlaceholder":268},[28,1054,1056],{"class":30,"line":1055},25,[28,1057,1058],{"class":95},"    // 移动构造函数（偷数据）\n",[28,1060,1062,1064,1066,1069,1071,1073,1076],{"class":30,"line":1061},26,[28,1063,880],{"class":34},[28,1065,82],{"class":38},[28,1067,1068],{"class":34},"Buffer",[28,1070,246],{"class":48},[28,1072,976],{"class":888},[28,1074,1075],{"class":38},") ",[28,1077,1078],{"class":48},"noexcept\n",[28,1080,1082,1085,1087,1090,1092],{"class":30,"line":1081},27,[28,1083,1084],{"class":38},"        : ",[28,1086,895],{"class":34},[28,1088,1089],{"class":38},"(other.data), ",[28,1091,587],{"class":34},[28,1093,994],{"class":38},[28,1095,1097],{"class":30,"line":1096},28,[28,1098,916],{"class":38},[28,1100,1102,1105,1107,1110,1112],{"class":30,"line":1101},29,[28,1103,1104],{"class":38},"        other.data ",[28,1106,227],{"class":48},[28,1108,1109],{"class":85}," nullptr",[28,1111,233],{"class":38},[28,1113,1114],{"class":95},"  // 让原对象安全析构\n",[28,1116,1118,1121,1123,1125],{"class":30,"line":1117},30,[28,1119,1120],{"class":38},"        other.size ",[28,1122,227],{"class":48},[28,1124,767],{"class":85},[28,1126,566],{"class":38},[28,1128,1130,1132,1134,1136,1139,1141,1143,1145,1147,1149,1151],{"class":30,"line":1129},31,[28,1131,921],{"class":34},[28,1133,551],{"class":38},[28,1135,554],{"class":48},[28,1137,1138],{"class":204}," \"Move constructor: stole \"",[28,1140,581],{"class":48},[28,1142,1032],{"class":38},[28,1144,554],{"class":48},[28,1146,938],{"class":204},[28,1148,560],{"class":85},[28,1150,563],{"class":204},[28,1152,566],{"class":38},[28,1154,1156],{"class":30,"line":1155},32,[28,1157,949],{"class":38},[28,1159,1161],{"class":30,"line":1160},33,[28,1162,269],{"emptyLinePlaceholder":268},[28,1164,1166,1169],{"class":30,"line":1165},34,[28,1167,1168],{"class":34},"    ~Buffer",[28,1170,58],{"class":38},[28,1172,1174],{"class":30,"line":1173},35,[28,1175,916],{"class":38},[28,1177,1179,1182],{"class":30,"line":1178},36,[28,1180,1181],{"class":48},"        delete[]",[28,1183,853],{"class":38},[28,1185,1187,1189,1191,1193,1196,1198,1200],{"class":30,"line":1186},37,[28,1188,921],{"class":34},[28,1190,551],{"class":38},[28,1192,554],{"class":48},[28,1194,1195],{"class":204}," \"Destructor",[28,1197,560],{"class":85},[28,1199,563],{"class":204},[28,1201,566],{"class":38},[28,1203,1205],{"class":30,"line":1204},38,[28,1206,949],{"class":38},[28,1208,1210],{"class":30,"line":1209},39,[28,1211,269],{"emptyLinePlaceholder":268},[28,1213,1215,1217,1220,1222,1224,1227,1230],{"class":30,"line":1214},40,[28,1216,858],{"class":48},[28,1218,1219],{"class":34}," get_size",[28,1221,590],{"class":38},[28,1223,967],{"class":48},[28,1225,1226],{"class":38}," { ",[28,1228,1229],{"class":48},"return",[28,1231,1232],{"class":38}," size; }\n",[28,1234,1236],{"class":30,"line":1235},41,[28,1237,307],{"class":38},[28,1239,1241],{"class":30,"line":1240},42,[28,1242,269],{"emptyLinePlaceholder":268},[28,1244,1246,1248,1250],{"class":30,"line":1245},43,[28,1247,49],{"class":48},[28,1249,474],{"class":34},[28,1251,58],{"class":38},[28,1253,1255],{"class":30,"line":1254},44,[28,1256,64],{"class":38},[28,1258,1260,1263,1266,1268,1271],{"class":30,"line":1259},45,[28,1261,1262],{"class":38},"    Buffer ",[28,1264,1265],{"class":34},"buf1",[28,1267,82],{"class":38},[28,1269,1270],{"class":85},"1000",[28,1272,89],{"class":38},[28,1274,1276],{"class":30,"line":1275},46,[28,1277,269],{"emptyLinePlaceholder":268},[28,1279,1281],{"class":30,"line":1280},47,[28,1282,1283],{"class":95},"    // 拷贝：会触发深拷贝\n",[28,1285,1287,1290,1292],{"class":30,"line":1286},48,[28,1288,1289],{"class":38},"    Buffer buf2 ",[28,1291,227],{"class":48},[28,1293,1294],{"class":38}," buf1;\n",[28,1296,1298,1300,1302,1304,1307,1309,1312,1315,1317,1319,1321,1323,1325],{"class":30,"line":1297},49,[28,1299,70],{"class":34},[28,1301,551],{"class":38},[28,1303,554],{"class":48},[28,1305,1306],{"class":204}," \"buf1 size after copy: \"",[28,1308,581],{"class":48},[28,1310,1311],{"class":38}," buf1.",[28,1313,1314],{"class":34},"get_size",[28,1316,590],{"class":38},[28,1318,554],{"class":48},[28,1320,595],{"class":204},[28,1322,560],{"class":85},[28,1324,563],{"class":204},[28,1326,566],{"class":38},[28,1328,1330],{"class":30,"line":1329},50,[28,1331,269],{"emptyLinePlaceholder":268},[28,1333,1335],{"class":30,"line":1334},51,[28,1336,1337],{"class":95},"    // 移动：数据被偷走，没有深拷贝！\n",[28,1339,1341,1344,1346,1348,1350,1352],{"class":30,"line":1340},52,[28,1342,1343],{"class":38},"    Buffer buf3 ",[28,1345,227],{"class":48},[28,1347,323],{"class":34},[28,1349,39],{"class":38},[28,1351,328],{"class":34},[28,1353,1354],{"class":38},"(buf2);\n",[28,1356,1358,1360,1362,1364,1367,1369,1372,1374,1376,1378,1380,1382,1384],{"class":30,"line":1357},53,[28,1359,70],{"class":34},[28,1361,551],{"class":38},[28,1363,554],{"class":48},[28,1365,1366],{"class":204}," \"buf2 size after move: \"",[28,1368,581],{"class":48},[28,1370,1371],{"class":38}," buf2.",[28,1373,1314],{"class":34},[28,1375,590],{"class":38},[28,1377,554],{"class":48},[28,1379,595],{"class":204},[28,1381,560],{"class":85},[28,1383,563],{"class":204},[28,1385,566],{"class":38},[28,1387,1389,1391,1393,1395,1398,1400,1403,1405,1407,1409,1411,1413,1415],{"class":30,"line":1388},54,[28,1390,70],{"class":34},[28,1392,551],{"class":38},[28,1394,554],{"class":48},[28,1396,1397],{"class":204}," \"buf3 size after move: \"",[28,1399,581],{"class":48},[28,1401,1402],{"class":38}," buf3.",[28,1404,1314],{"class":34},[28,1406,590],{"class":38},[28,1408,554],{"class":48},[28,1410,595],{"class":204},[28,1412,560],{"class":85},[28,1414,563],{"class":204},[28,1416,566],{"class":38},[28,1418,1420],{"class":30,"line":1419},55,[28,1421,269],{"emptyLinePlaceholder":268},[28,1423,1425,1427,1429],{"class":30,"line":1424},56,[28,1426,102],{"class":48},[28,1428,767],{"class":85},[28,1430,566],{"class":38},[28,1432,1434],{"class":30,"line":1433},57,[28,1435,114],{"class":38},[14,1437,1438,780],{},[119,1439,779],{},[18,1441,1444],{"className":1442,"code":1443,"language":786},[784],"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",[25,1445,1443],{"__ignoreMap":23},[441,1447,1449],{"id":1448},"示例-3在示例-2-基础上移动语义让函数返回大对象高效","示例 3：在示例 2 基础上，移动语义让函数返回大对象高效",[18,1451,1453],{"className":20,"code":1452,"language":22,"meta":23,"style":23},"#include \u003Ciostream>\n#include \u003Cvector>\n#include \u003Cstring>\n\n// 返回大 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;  // ✅ 编译器自动移动（或 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    // ⚠️ 错误做法：不要对返回值用 std::move！\n    // auto data2 = std::move(make_data(5));  // ❌ 不要这样写！破坏 RVO 优化\n\n    // ✅ 正确做法：赋值给已有变量时用 = std::move(source)\n    std::vector\u003Cint> old = {100, 200};\n    std::vector\u003Cint> fresh = std::move(old);  // 把 old 的内容移给 fresh\n    std::cout \u003C\u003C \"old size = \" \u003C\u003C old.size() \u003C\u003C \"\\n\";      // 0\n    std::cout \u003C\u003C \"fresh size = \" \u003C\u003C fresh.size() \u003C\u003C \"\\n\";  // 2\n\n    return 0;\n}\n",[25,1454,1455,1461,1467,1473,1477,1482,1508,1512,1525,1556,1560,1577,1581,1590,1594,1598,1606,1610,1629,1642,1653,1657,1674,1678,1694,1724,1728,1733,1741,1745,1750,1775,1800,1833,1866,1870,1878],{"__ignoreMap":23},[28,1456,1457,1459],{"class":30,"line":31},[28,1458,201],{"class":48},[28,1460,456],{"class":204},[28,1462,1463,1465],{"class":30,"line":61},[28,1464,201],{"class":48},[28,1466,463],{"class":204},[28,1468,1469,1471],{"class":30,"line":67},[28,1470,201],{"class":48},[28,1472,820],{"class":204},[28,1474,1475],{"class":30,"line":92},[28,1476,269],{"emptyLinePlaceholder":268},[28,1478,1479],{"class":30,"line":99},[28,1480,1481],{"class":95},"// 返回大 vector（C++11 起自动启用移动语义，不需要手动 std::move）\n",[28,1483,1484,1486,1488,1490,1492,1494,1496,1499,1501,1503,1505],{"class":30,"line":111},[28,1485,35],{"class":34},[28,1487,39],{"class":38},[28,1489,42],{"class":34},[28,1491,45],{"class":38},[28,1493,49],{"class":48},[28,1495,52],{"class":38},[28,1497,1498],{"class":34},"make_data",[28,1500,82],{"class":38},[28,1502,49],{"class":48},[28,1504,889],{"class":888},[28,1506,1507],{"class":38},")\n",[28,1509,1510],{"class":30,"line":519},[28,1511,64],{"class":38},[28,1513,1514,1516,1518,1520,1522],{"class":30,"line":524},[28,1515,70],{"class":34},[28,1517,73],{"class":38},[28,1519,76],{"class":48},[28,1521,79],{"class":34},[28,1523,1524],{"class":38},"(n);\n",[28,1526,1527,1530,1533,1535,1538,1540,1542,1545,1547,1550,1553],{"class":30,"line":530},[28,1528,1529],{"class":48},"    for",[28,1531,1532],{"class":38}," (",[28,1534,49],{"class":48},[28,1536,1537],{"class":38}," i ",[28,1539,227],{"class":48},[28,1541,767],{"class":85},[28,1543,1544],{"class":38},"; i ",[28,1546,45],{"class":48},[28,1548,1549],{"class":38}," n; ",[28,1551,1552],{"class":48},"++",[28,1554,1555],{"class":38},"i)\n",[28,1557,1558],{"class":30,"line":546},[28,1559,916],{"class":38},[28,1561,1562,1565,1567,1569,1572,1575],{"class":30,"line":569},[28,1563,1564],{"class":38},"        v[i] ",[28,1566,227],{"class":48},[28,1568,1537],{"class":38},[28,1570,1571],{"class":48},"*",[28,1573,1574],{"class":85}," 10",[28,1576,566],{"class":38},[28,1578,1579],{"class":30,"line":607},[28,1580,949],{"class":38},[28,1582,1583,1585,1587],{"class":30,"line":640},[28,1584,102],{"class":48},[28,1586,105],{"class":38},[28,1588,1589],{"class":95},"  // ✅ 编译器自动移动（或 RVO 优化），不拷贝\n",[28,1591,1592],{"class":30,"line":645},[28,1593,114],{"class":38},[28,1595,1596],{"class":30,"line":651},[28,1597,269],{"emptyLinePlaceholder":268},[28,1599,1600,1602,1604],{"class":30,"line":674},[28,1601,49],{"class":48},[28,1603,474],{"class":34},[28,1605,58],{"class":38},[28,1607,1608],{"class":30,"line":692},[28,1609,64],{"class":38},[28,1611,1612,1615,1618,1620,1623,1625,1627],{"class":30,"line":724},[28,1613,1614],{"class":48},"    auto",[28,1616,1617],{"class":38}," data ",[28,1619,227],{"class":48},[28,1621,1622],{"class":34}," make_data",[28,1624,82],{"class":38},[28,1626,514],{"class":85},[28,1628,89],{"class":38},[28,1630,1631,1633,1635,1637,1640],{"class":30,"line":757},[28,1632,70],{"class":34},[28,1634,551],{"class":38},[28,1636,554],{"class":48},[28,1638,1639],{"class":204}," \"data: \"",[28,1641,566],{"class":38},[28,1643,1644,1646,1648,1650],{"class":30,"line":762},[28,1645,1529],{"class":48},[28,1647,1532],{"class":38},[28,1649,49],{"class":48},[28,1651,1652],{"class":38}," n : data)\n",[28,1654,1655],{"class":30,"line":772},[28,1656,916],{"class":38},[28,1658,1659,1661,1663,1665,1667,1669,1672],{"class":30,"line":1018},[28,1660,921],{"class":34},[28,1662,551],{"class":38},[28,1664,554],{"class":48},[28,1666,933],{"class":38},[28,1668,554],{"class":48},[28,1670,1671],{"class":204}," \" \"",[28,1673,566],{"class":38},[28,1675,1676],{"class":30,"line":1045},[28,1677,949],{"class":38},[28,1679,1680,1682,1684,1686,1688,1690,1692],{"class":30,"line":1050},[28,1681,70],{"class":34},[28,1683,551],{"class":38},[28,1685,554],{"class":48},[28,1687,595],{"class":204},[28,1689,560],{"class":85},[28,1691,563],{"class":204},[28,1693,566],{"class":38},[28,1695,1696,1698,1700,1702,1705,1707,1710,1712,1714,1716,1718,1720,1722],{"class":30,"line":1055},[28,1697,70],{"class":34},[28,1699,551],{"class":38},[28,1701,554],{"class":48},[28,1703,1704],{"class":204}," \"size = \"",[28,1706,581],{"class":48},[28,1708,1709],{"class":38}," data.",[28,1711,587],{"class":34},[28,1713,590],{"class":38},[28,1715,554],{"class":48},[28,1717,595],{"class":204},[28,1719,560],{"class":85},[28,1721,563],{"class":204},[28,1723,566],{"class":38},[28,1725,1726],{"class":30,"line":1061},[28,1727,269],{"emptyLinePlaceholder":268},[28,1729,1730],{"class":30,"line":1081},[28,1731,1732],{"class":95},"    // ⚠️ 错误做法：不要对返回值用 std::move！\n",[28,1734,1735,1738],{"class":30,"line":1096},[28,1736,1737],{"class":95},"    // auto data2 = std::move(make_data(5));",[28,1739,1740],{"class":95},"  // ❌ 不要这样写！破坏 RVO 优化\n",[28,1742,1743],{"class":30,"line":1101},[28,1744,269],{"emptyLinePlaceholder":268},[28,1746,1747],{"class":30,"line":1117},[28,1748,1749],{"class":95},"    // ✅ 正确做法：赋值给已有变量时用 = std::move(source)\n",[28,1751,1752,1754,1756,1758,1761,1763,1765,1768,1770,1773],{"class":30,"line":1129},[28,1753,70],{"class":34},[28,1755,73],{"class":38},[28,1757,76],{"class":48},[28,1759,1760],{"class":38}," old ",[28,1762,227],{"class":48},[28,1764,290],{"class":38},[28,1766,1767],{"class":85},"100",[28,1769,296],{"class":38},[28,1771,1772],{"class":85},"200",[28,1774,307],{"class":38},[28,1776,1777,1779,1781,1783,1786,1788,1790,1792,1794,1797],{"class":30,"line":1155},[28,1778,70],{"class":34},[28,1780,73],{"class":38},[28,1782,76],{"class":48},[28,1784,1785],{"class":38}," fresh ",[28,1787,227],{"class":48},[28,1789,323],{"class":34},[28,1791,39],{"class":38},[28,1793,328],{"class":34},[28,1795,1796],{"class":38},"(old);",[28,1798,1799],{"class":95},"  // 把 old 的内容移给 fresh\n",[28,1801,1802,1804,1806,1808,1811,1813,1816,1818,1820,1822,1824,1826,1828,1830],{"class":30,"line":1160},[28,1803,70],{"class":34},[28,1805,551],{"class":38},[28,1807,554],{"class":48},[28,1809,1810],{"class":204}," \"old size = \"",[28,1812,581],{"class":48},[28,1814,1815],{"class":38}," old.",[28,1817,587],{"class":34},[28,1819,590],{"class":38},[28,1821,554],{"class":48},[28,1823,595],{"class":204},[28,1825,560],{"class":85},[28,1827,563],{"class":204},[28,1829,233],{"class":38},[28,1831,1832],{"class":95},"      // 0\n",[28,1834,1835,1837,1839,1841,1844,1846,1849,1851,1853,1855,1857,1859,1861,1863],{"class":30,"line":1165},[28,1836,70],{"class":34},[28,1838,551],{"class":38},[28,1840,554],{"class":48},[28,1842,1843],{"class":204}," \"fresh size = \"",[28,1845,581],{"class":48},[28,1847,1848],{"class":38}," fresh.",[28,1850,587],{"class":34},[28,1852,590],{"class":38},[28,1854,554],{"class":48},[28,1856,595],{"class":204},[28,1858,560],{"class":85},[28,1860,563],{"class":204},[28,1862,233],{"class":38},[28,1864,1865],{"class":95},"  // 2\n",[28,1867,1868],{"class":30,"line":1173},[28,1869,269],{"emptyLinePlaceholder":268},[28,1871,1872,1874,1876],{"class":30,"line":1178},[28,1873,102],{"class":48},[28,1875,767],{"class":85},[28,1877,566],{"class":38},[28,1879,1880],{"class":30,"line":1186},[28,1881,114],{"class":38},[14,1883,1884,780],{},[119,1885,779],{},[18,1887,1890],{"className":1888,"code":1889,"language":786},[784],"data: 0 10 20 30 40 \nsize = 5\nold size = 0\nfresh size = 2\n",[25,1891,1889],{"__ignoreMap":23},[10,1893,779],{"id":779},[14,1895,1896],{},"见上方每个示例的\"运行结果\"。",[10,1898,1899],{"id":1899},"示例中的关键语法解释",[340,1901,1902,1921],{},[343,1903,1904],{},[346,1905,1906,1909,1912,1915,1918],{},[349,1907,1908],{"align":351},"示例",[349,1910,1911],{"align":351},"讲了什么",[349,1913,1914],{"align":351},"新出现的语法",[349,1916,1917],{"align":351},"为什么这样写",[349,1919,1920],{"align":351},"注意事项",[360,1922,1923,1943,1968],{},[346,1924,1925,1928,1931,1937,1940],{},[365,1926,1927],{"align":351},"示例 1",[365,1929,1930],{"align":351},"拷贝 vs 移动对比",[365,1932,1933,1936],{"align":351},[25,1934,1935],{},"std::move()","、移动后 size=0",[365,1938,1939],{"align":351},"move 后源对象被\"掏空\"，变成有效但未指定状态",[365,1941,1942],{"align":351},"move 后不要再使用源对象（除非重新赋值）",[346,1944,1945,1948,1951,1962,1965],{},[365,1946,1947],{"align":351},"示例 2",[365,1949,1950],{"align":351},"自定义移动构造",[365,1952,1953,139,1956,139,1959],{"align":351},[25,1954,1955],{},"Buffer(Buffer&&)",[25,1957,1958],{},"noexcept",[25,1960,1961],{},"other.data=nullptr",[365,1963,1964],{"align":351},"移动构造直接偷指针，不分配新内存",[365,1966,1967],{"align":351},"移动后必须把 other.data 置 null，否则重复 delete",[346,1969,1970,1973,1976,1983,1986],{},[365,1971,1972],{"align":351},"示例 3",[365,1974,1975],{"align":351},"返回值和赋值优化",[365,1977,1978,1979,1982],{"align":351},"RVO、",[25,1980,1981],{},"return v"," 不加 move",[365,1984,1985],{"align":351},"编译器会优化返回值为移动/RVO，加了 move 反而阻止 RVO",[365,1987,1988],{"align":351},"局部变量 return 时不要加 std::move",[10,1990,1992],{"id":1991},"为什么移动构造要写-noexcept","为什么移动构造要写 noexcept",[14,1994,1995,1998,1999,2001,2002,2004],{},[25,1996,1997],{},"std::vector"," 扩容时要把旧元素搬到新内存。如果元素类型的移动构造可能抛异常，",[25,2000,42],{}," 为了保证异常安全，可能宁愿走拷贝构造。也就是说：你明明写了移动构造，但如果没写 ",[25,2003,1958],{},"，容器扩容时不一定用它。",[18,2006,2008],{"className":20,"code":2007,"language":22,"meta":23,"style":23},"class Buffer\n{\npublic:\n    Buffer(Buffer&& other) noexcept\n    {\n        // 偷资源，不抛异常\n    }\n};\n",[25,2009,2010,2016,2020,2024,2040,2044,2049,2053],{"__ignoreMap":23},[28,2011,2012,2014],{"class":30,"line":31},[28,2013,838],{"class":48},[28,2015,841],{"class":34},[28,2017,2018],{"class":30,"line":61},[28,2019,64],{"class":38},[28,2021,2022],{"class":30,"line":67},[28,2023,870],{"class":48},[28,2025,2026,2028,2030,2032,2034,2036,2038],{"class":30,"line":92},[28,2027,880],{"class":34},[28,2029,82],{"class":38},[28,2031,1068],{"class":34},[28,2033,246],{"class":48},[28,2035,976],{"class":888},[28,2037,1075],{"class":38},[28,2039,1078],{"class":48},[28,2041,2042],{"class":30,"line":99},[28,2043,916],{"class":38},[28,2045,2046],{"class":30,"line":111},[28,2047,2048],{"class":95},"        // 偷资源，不抛异常\n",[28,2050,2051],{"class":30,"line":519},[28,2052,949],{"class":38},[28,2054,2055],{"class":30,"line":524},[28,2056,307],{"class":38},[14,2058,2059,2060,2063,2064,2067,2068,2070],{},"这个差异在单独移动一个对象时看不明显；当 ",[25,2061,2062],{},"vector\u003CBuffer>"," 大量 ",[25,2065,2066],{},"push_back"," 触发扩容时，是否 ",[25,2069,1958],{}," 才会影响容器选择移动还是拷贝。",[10,2072,2074],{"id":2073},"stdmove-什么时候该用什么时候不该用","std::move 什么时候该用，什么时候不该用",[340,2076,2077,2092],{},[343,2078,2079],{},[346,2080,2081,2084,2089],{},[349,2082,2083],{"align":351},"场景",[349,2085,2086,2087],{"align":351},"是否用 ",[25,2088,180],{},[349,2090,2091],{"align":351},"原因",[360,2093,2094,2105,2121,2134,2147],{},[346,2095,2096,2099,2102],{},[365,2097,2098],{"align":351},"把已有对象的资源转给另一个对象",[365,2100,2101],{"align":351},"✅",[365,2103,2104],{"align":351},"明确转移所有权或内容",[346,2106,2107,2114,2116],{},[365,2108,2109,2110,2113],{"align":351},"把 ",[25,2111,2112],{},"unique_ptr"," 传给接收所有权的函数",[365,2115,2101],{"align":351},[365,2117,2118,2120],{"align":351},[25,2119,2112],{}," 不能拷贝，只能移动",[346,2122,2123,2128,2131],{},[365,2124,2125,2127],{"align":351},[25,2126,1229],{}," 局部变量",[365,2129,2130],{"align":351},"❌",[365,2132,2133],{"align":351},"让编译器做 RVO / NRVO",[346,2135,2136,2142,2144],{},[365,2137,2138,2139,2141],{"align":351},"对 ",[25,2140,967],{}," 对象",[365,2143,2130],{"align":351},[365,2145,2146],{"align":351},"const 对象不能被真正移动，通常变成拷贝",[346,2148,2149,2152,2154],{},[365,2150,2151],{"align":351},"move 后还想继续读原对象内容",[365,2153,2130],{"align":351},[365,2155,2156],{"align":351},"moved-from 对象只保证可析构、可重新赋值",[10,2158,2159],{"id":2159},"常见错误",[14,2161,2162],{},[119,2163,2164],{},"错误 1：move 之后继续使用源对象",[18,2166,2168],{"className":20,"code":2167,"language":22,"meta":23,"style":23},"std::vector\u003Cint> a = {1, 2, 3};\nstd::vector\u003Cint> b = std::move(a);\nstd::cout \u003C\u003C a[0];  // ❌ a 已经被\"掏空\"，行为未定义\n",[25,2169,2170,2197,2219],{"__ignoreMap":23},[28,2171,2172,2174,2176,2178,2181,2183,2185,2187,2189,2191,2193,2195],{"class":30,"line":31},[28,2173,35],{"class":34},[28,2175,73],{"class":38},[28,2177,76],{"class":48},[28,2179,2180],{"class":38}," a ",[28,2182,227],{"class":48},[28,2184,290],{"class":38},[28,2186,293],{"class":85},[28,2188,296],{"class":38},[28,2190,299],{"class":85},[28,2192,296],{"class":38},[28,2194,304],{"class":85},[28,2196,307],{"class":38},[28,2198,2199,2201,2203,2205,2208,2210,2212,2214,2216],{"class":30,"line":61},[28,2200,35],{"class":34},[28,2202,73],{"class":38},[28,2204,76],{"class":48},[28,2206,2207],{"class":38}," b ",[28,2209,227],{"class":48},[28,2211,323],{"class":34},[28,2213,39],{"class":38},[28,2215,328],{"class":34},[28,2217,2218],{"class":38},"(a);\n",[28,2220,2221,2223,2225,2227,2230,2233,2236],{"class":30,"line":67},[28,2222,35],{"class":34},[28,2224,551],{"class":38},[28,2226,554],{"class":48},[28,2228,2229],{"class":38}," a[",[28,2231,2232],{"class":85},"0",[28,2234,2235],{"class":38},"];",[28,2237,2238],{"class":95},"  // ❌ a 已经被\"掏空\"，行为未定义\n",[14,2240,2241],{},"正确做法：move 后不要再使用源对象，或者先检查是否为空。",[14,2243,2244],{},[119,2245,2246],{},"错误 2：对 const 对象用 move",[18,2248,2250],{"className":20,"code":2249,"language":22,"meta":23,"style":23},"const std::vector\u003Cint> a = {1, 2, 3};\nstd::vector\u003Cint> b = std::move(a);  // ❌ 实际执行的是拷贝！const 对象不能移动\n",[25,2251,2252,2280],{"__ignoreMap":23},[28,2253,2254,2256,2258,2260,2262,2264,2266,2268,2270,2272,2274,2276,2278],{"class":30,"line":31},[28,2255,967],{"class":48},[28,2257,323],{"class":34},[28,2259,73],{"class":38},[28,2261,76],{"class":48},[28,2263,2180],{"class":38},[28,2265,227],{"class":48},[28,2267,290],{"class":38},[28,2269,293],{"class":85},[28,2271,296],{"class":38},[28,2273,299],{"class":85},[28,2275,296],{"class":38},[28,2277,304],{"class":85},[28,2279,307],{"class":38},[28,2281,2282,2284,2286,2288,2290,2292,2294,2296,2298,2301],{"class":30,"line":61},[28,2283,35],{"class":34},[28,2285,73],{"class":38},[28,2287,76],{"class":48},[28,2289,2207],{"class":38},[28,2291,227],{"class":48},[28,2293,323],{"class":34},[28,2295,39],{"class":38},[28,2297,328],{"class":34},[28,2299,2300],{"class":38},"(a);",[28,2302,2303],{"class":95},"  // ❌ 实际执行的是拷贝！const 对象不能移动\n",[14,2305,2306],{},"正确做法：move 不要用于 const 对象。",[14,2308,2309],{},[119,2310,2311],{},"错误 3：给返回值加 std::move",[18,2313,2315],{"className":20,"code":2314,"language":22,"meta":23,"style":23},"std::vector\u003Cint> func()\n{\n    std::vector\u003Cint> v(1000);\n    return std::move(v);  // ❌ 阻止了 RVO 优化！\n}\n",[25,2316,2317,2336,2340,2356,2372],{"__ignoreMap":23},[28,2318,2319,2321,2323,2325,2327,2329,2331,2334],{"class":30,"line":31},[28,2320,35],{"class":34},[28,2322,39],{"class":38},[28,2324,42],{"class":34},[28,2326,45],{"class":38},[28,2328,49],{"class":48},[28,2330,52],{"class":38},[28,2332,2333],{"class":34},"func",[28,2335,58],{"class":38},[28,2337,2338],{"class":30,"line":61},[28,2339,64],{"class":38},[28,2341,2342,2344,2346,2348,2350,2352,2354],{"class":30,"line":67},[28,2343,70],{"class":34},[28,2345,73],{"class":38},[28,2347,76],{"class":48},[28,2349,79],{"class":34},[28,2351,82],{"class":38},[28,2353,1270],{"class":85},[28,2355,89],{"class":38},[28,2357,2358,2360,2362,2364,2366,2369],{"class":30,"line":92},[28,2359,102],{"class":48},[28,2361,323],{"class":34},[28,2363,39],{"class":38},[28,2365,328],{"class":34},[28,2367,2368],{"class":38},"(v);",[28,2370,2371],{"class":95},"  // ❌ 阻止了 RVO 优化！\n",[28,2373,2374],{"class":30,"line":99},[28,2375,114],{"class":38},[14,2377,2378,2379,2382],{},"正确做法：直接 ",[25,2380,2381],{},"return v;","，编译器会自动优化。",[14,2384,2385],{},[119,2386,2387],{},"错误 4：移动构造函数没有标记 noexcept",[18,2389,2391],{"className":20,"code":2390,"language":22,"meta":23,"style":23},"MyClass(MyClass&& other) { ... }  // 缺少 noexcept\n",[25,2392,2393],{"__ignoreMap":23},[28,2394,2395,2398,2401,2403,2406],{"class":30,"line":31},[28,2396,2397],{"class":34},"MyClass",[28,2399,2400],{"class":38},"(MyClass",[28,2402,246],{"class":48},[28,2404,2405],{"class":38}," other) { ... }",[28,2407,2408],{"class":95},"  // 缺少 noexcept\n",[14,2410,2411,2412,2415],{},"正确做法：",[25,2413,2414],{},"MyClass(MyClass&& other) noexcept { ... }"," — 不标记 noexcept 会导致 vector 等容器在扩容时退化为拷贝。",[10,2417,2418],{"id":2418},"使用建议",[2420,2421,2422,2428,2441,2447,2455],"ol",{},[130,2423,2424,2427],{},[119,2425,2426],{},"return 时不要加 std::move","：让编译器自动优化（RVO/NRVO）。",[130,2429,2430,2436,2437,2440],{},[119,2431,2432,2433],{},"赋值给已有对象时用 ",[25,2434,2435],{},"std::move(source)","：用 ",[25,2438,2439],{},"target = std::move(source)"," 避免拷贝。",[130,2442,2443,2446],{},[119,2444,2445],{},"move 后不要再用源对象","（除非重新赋值或重置）。",[130,2448,2449,2454],{},[119,2450,2451,2452],{},"移动构造函数必须标记 ",[25,2453,1958],{},"：否则 STL 容器在扩容时不会调用它。",[130,2456,2457,2462],{},[119,2458,2459,2461],{},[25,2460,180],{}," 不移动任何东西","：它只是类型转换，把左值变成右值引用。真正的移动发生在移动构造函数或移动赋值运算符中。",[10,2464,2465],{"id":2465},"小结",[127,2467,2468,2471,2476,2479,2484,2487],{},[130,2469,2470],{},"左值有名字、可取地址；右值是临时的（字面量、临时对象）。",[130,2472,163,2473,2475],{},[25,2474,166],{}," 绑定到右值。",[130,2477,2478],{},"移动语义\"偷\"右值的资源，避免深拷贝。",[130,2480,2481,2483],{},[25,2482,158],{}," 把左值转为右值，告诉编译器\"x 可以被偷\"。",[130,2485,2486],{},"return 局部变量时不要加 std::move（让编译器自己优化）。",[130,2488,2451,2489,143],{},[25,2490,1958],{},[441,2492,2493],{"id":2493},"工程拓展",[14,2495,2496],{},"在 ROS2 中，发布消息、传输大量传感器数据（如点云、图像）时，移动语义能避免大数据拷贝。在 Boost.Asio 中，异步操作的回调参数大量使用移动语义来高效传递数据缓冲区。",[2498,2499,2500],"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":23,"searchDepth":61,"depth":61,"links":2502},[2503,2504,2505,2506,2507,2508,2509,2514,2515,2516,2517,2518,2519,2520],{"id":12,"depth":61,"text":12},{"id":125,"depth":61,"text":125},{"id":184,"depth":61,"text":185},{"id":191,"depth":61,"text":191},{"id":211,"depth":61,"text":211},{"id":337,"depth":61,"text":338},{"id":439,"depth":61,"text":439,"children":2510},[2511,2512,2513],{"id":443,"depth":67,"text":444},{"id":791,"depth":67,"text":792},{"id":1448,"depth":67,"text":1449},{"id":779,"depth":61,"text":779},{"id":1899,"depth":61,"text":1899},{"id":1991,"depth":61,"text":1992},{"id":2073,"depth":61,"text":2074},{"id":2159,"depth":61,"text":2159},{"id":2418,"depth":61,"text":2418},{"id":2465,"depth":61,"text":2465,"children":2521},[2522],{"id":2493,"depth":67,"text":2493},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-10-you-zhi-yin-yong-he-yi-dong-yu-yi","18.10",18100000,"2023-10-05","wiki/2023-10-05-cplusplus-jiao-xue","zh-cn:2023-10-05-cplusplus-jiao-xue","/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue","Cplusplus教学","md","wiki/2023-10-05-Cplusplus教学/ch18-10-右值引用和移动语义",false,null,"/wiki/2023-10-05-cplusplus-jiao-xue/ch18-10-you-zhi-yin-yong-he-yi-dong-yu-yi","zh-CN","zh-cn",{},{"title":5,"description":23},"Q-1PD_hvZ__h0o3aYZRAxhc9sLwaMAFo8Dq9SRqKSKo",[2542,2547,2553,2559,2565,2571,2577,2583,2589,2595,2601,2607,2613,2619,2625,2631,2637,2643,2649,2655,2661,2667,2673,2679,2685,2686,2692,2698,2704,2710,2716,2722,2728,2734,2740,2746,2752,2758,2764,2770,2776,2782,2788,2794,2800,2806,2812,2818,2824,2830,2836,2842,2848,2854,2860,2866,2872,2878,2884,2890,2896,2902,2907,2912,2917,2922,2928,2934,2940,2946],{"path":2543,"stem":2544,"title":2545,"date":2526,"chapter":293,"chapterSort":2546,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch1-c-ji-chu-chu-shi","wiki/2023-10-05-Cplusplus教学/ch1-C++基础初识","C++基础初识",1000000,{"path":2548,"stem":2549,"title":2550,"date":2526,"chapter":2551,"chapterSort":2552,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch10-nei-cun-fen-qu-yu-sheng-ming-zhou-qi","wiki/2023-10-05-Cplusplus教学/ch10-内存分区与生命周期","内存分区与生命周期","10",10000000,{"path":2554,"stem":2555,"title":2556,"date":2526,"chapter":2557,"chapterSort":2558,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch11-yin-yong","wiki/2023-10-05-Cplusplus教学/ch11-引用","引用","11",11000000,{"path":2560,"stem":2561,"title":2562,"date":2526,"chapter":2563,"chapterSort":2564,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch12-han-shu-ti-gao-yu-ming-ming-kong-jian","wiki/2023-10-05-Cplusplus教学/ch12-函数提高与命名空间","函数提高与命名空间","12",12000000,{"path":2566,"stem":2567,"title":2568,"date":2526,"chapter":2569,"chapterSort":2570,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-1-feng-zhuang","wiki/2023-10-05-Cplusplus教学/ch13-1-封装","封装","13.1",13010000,{"path":2572,"stem":2573,"title":2574,"date":2526,"chapter":2575,"chapterSort":2576,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-2-dui-xiang-chu-shi-hua-he-qing-li","wiki/2023-10-05-Cplusplus教学/ch13-2-对象初始化和清理","对象初始化和清理","13.2",13020000,{"path":2578,"stem":2579,"title":2580,"date":2526,"chapter":2581,"chapterSort":2582,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-3-dui-xiang-mo-xing-yu-this-zhi-zhen","wiki/2023-10-05-Cplusplus教学/ch13-3-对象模型与this指针","对象模型与this指针","13.3",13030000,{"path":2584,"stem":2585,"title":2586,"date":2526,"chapter":2587,"chapterSort":2588,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-4-you-yuan-yu-yun-suan-fu-zhong-zai","wiki/2023-10-05-Cplusplus教学/ch13-4-友元与运算符重载","友元与运算符重载","13.4",13040000,{"path":2590,"stem":2591,"title":2592,"date":2526,"chapter":2593,"chapterSort":2594,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-5-ji-cheng","wiki/2023-10-05-Cplusplus教学/ch13-5-继承","继承","13.5",13050000,{"path":2596,"stem":2597,"title":2598,"date":2526,"chapter":2599,"chapterSort":2600,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-6-duo-tai","wiki/2023-10-05-Cplusplus教学/ch13-6-多态","多态","13.6",13060000,{"path":2602,"stem":2603,"title":2604,"date":2526,"chapter":2605,"chapterSort":2606,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-lei-he-dui-xiang","wiki/2023-10-05-Cplusplus教学/ch13-类和对象","类和对象","13",13000000,{"path":2608,"stem":2609,"title":2610,"date":2526,"chapter":2611,"chapterSort":2612,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch14-wen-jian-cao-zuo","wiki/2023-10-05-Cplusplus教学/ch14-文件操作","文件操作","14",14000000,{"path":2614,"stem":2615,"title":2616,"date":2526,"chapter":2617,"chapterSort":2618,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch15-mu-ban","wiki/2023-10-05-Cplusplus教学/ch15-模板","模板","15",15000000,{"path":2620,"stem":2621,"title":2622,"date":2526,"chapter":2623,"chapterSort":2624,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-1-stl-chu-shi","wiki/2023-10-05-Cplusplus教学/ch16-1-STL初识","STL初识","16.1",16010000,{"path":2626,"stem":2627,"title":2628,"date":2526,"chapter":2629,"chapterSort":2630,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-2-std-array","wiki/2023-10-05-Cplusplus教学/ch16-2-std-array","std::array","16.2",16020000,{"path":2632,"stem":2633,"title":2634,"date":2526,"chapter":2635,"chapterSort":2636,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-3-string-rong-qi","wiki/2023-10-05-Cplusplus教学/ch16-3-string容器","string容器","16.3",16030000,{"path":2638,"stem":2639,"title":2640,"date":2526,"chapter":2641,"chapterSort":2642,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-4-vector-yu-deque-rong-qi","wiki/2023-10-05-Cplusplus教学/ch16-4-vector与deque容器","vector与deque容器","16.4",16040000,{"path":2644,"stem":2645,"title":2646,"date":2526,"chapter":2647,"chapterSort":2648,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-5-stack-queue-list-rong-qi","wiki/2023-10-05-Cplusplus教学/ch16-5-stack-queue-list容器","stack / queue / list 容器","16.5",16050000,{"path":2650,"stem":2651,"title":2652,"date":2526,"chapter":2653,"chapterSort":2654,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-6-set-map-rong-qi","wiki/2023-10-05-Cplusplus教学/ch16-6-set-map容器","set / map 容器","16.6",16060000,{"path":2656,"stem":2657,"title":2658,"date":2526,"chapter":2659,"chapterSort":2660,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-7-han-shu-dui-xiang-yu-wei-ci","wiki/2023-10-05-Cplusplus教学/ch16-7-函数对象与谓词","函数对象与谓词","16.7",16070000,{"path":2662,"stem":2663,"title":2664,"date":2526,"chapter":2665,"chapterSort":2666,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-8-chang-yong-suan-fa","wiki/2023-10-05-Cplusplus教学/ch16-8-常用算法","常用算法","16.8",16080000,{"path":2668,"stem":2669,"title":2670,"date":2526,"chapter":2671,"chapterSort":2672,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch16-stl-ti-gao-bian-cheng","wiki/2023-10-05-Cplusplus教学/ch16-STL提高编程","STL提高编程","16",16000000,{"path":2674,"stem":2675,"title":2676,"date":2526,"chapter":2677,"chapterSort":2678,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch17-c-lei-xing-zhuan-huan","wiki/2023-10-05-Cplusplus教学/ch17-C++类型转换","C++类型转换","17",17000000,{"path":2680,"stem":2681,"title":2682,"date":2526,"chapter":2683,"chapterSort":2684,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-1-auto","wiki/2023-10-05-Cplusplus教学/ch18-1-auto","auto","18.1",18010000,{"path":2523,"stem":2532,"title":5,"date":2526,"chapter":2524,"chapterSort":2525,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},{"path":2687,"stem":2688,"title":2689,"date":2526,"chapter":2690,"chapterSort":2691,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-11-lambda-biao-da-shi","wiki/2023-10-05-Cplusplus教学/ch18-11-Lambda表达式","Lambda 表达式","18.11",18110000,{"path":2693,"stem":2694,"title":2695,"date":2526,"chapter":2696,"chapterSort":2697,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-12-std-function","wiki/2023-10-05-Cplusplus教学/ch18-12-std-function","std::function","18.12",18120000,{"path":2699,"stem":2700,"title":2701,"date":2526,"chapter":2702,"chapterSort":2703,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-13-std-bind","wiki/2023-10-05-Cplusplus教学/ch18-13-std-bind","std::bind","18.13",18130000,{"path":2705,"stem":2706,"title":2707,"date":2526,"chapter":2708,"chapterSort":2709,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-14-std-optional","wiki/2023-10-05-Cplusplus教学/ch18-14-std-optional","std::optional","18.14",18140000,{"path":2711,"stem":2712,"title":2713,"date":2526,"chapter":2714,"chapterSort":2715,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-15-std-variant","wiki/2023-10-05-Cplusplus教学/ch18-15-std-variant","std::variant","18.15",18150000,{"path":2717,"stem":2718,"title":2719,"date":2526,"chapter":2720,"chapterSort":2721,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-16-std-span","wiki/2023-10-05-Cplusplus教学/ch18-16-std-span","std::span","18.16",18160000,{"path":2723,"stem":2724,"title":2725,"date":2526,"chapter":2726,"chapterSort":2727,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-17-std-format-print","wiki/2023-10-05-Cplusplus教学/ch18-17-std-format-print","std::format / std::print","18.17",18170000,{"path":2729,"stem":2730,"title":2731,"date":2526,"chapter":2732,"chapterSort":2733,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-18-std-chrono","wiki/2023-10-05-Cplusplus教学/ch18-18-std-chrono","std::chrono","18.18",18180000,{"path":2735,"stem":2736,"title":2737,"date":2526,"chapter":2738,"chapterSort":2739,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-1-std-thread","wiki/2023-10-05-Cplusplus教学/ch18-19-1-std-thread","std::thread 与 join","18.19.1",18190100,{"path":2741,"stem":2742,"title":2743,"date":2526,"chapter":2744,"chapterSort":2745,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-2-mutex-lock-guard","wiki/2023-10-05-Cplusplus教学/ch18-19-2-mutex-lock-guard","mutex 与 lock_guard","18.19.2",18190200,{"path":2747,"stem":2748,"title":2749,"date":2526,"chapter":2750,"chapterSort":2751,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-3-std-atomic","wiki/2023-10-05-Cplusplus教学/ch18-19-3-std-atomic","std::atomic","18.19.3",18190300,{"path":2753,"stem":2754,"title":2755,"date":2526,"chapter":2756,"chapterSort":2757,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-4-condition-variable","wiki/2023-10-05-Cplusplus教学/ch18-19-4-condition-variable","condition_variable","18.19.4",18190400,{"path":2759,"stem":2760,"title":2761,"date":2526,"chapter":2762,"chapterSort":2763,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-19-bing-fa-bian-cheng","wiki/2023-10-05-Cplusplus教学/ch18-19-并发编程","并发编程","18.19",18190000,{"path":2765,"stem":2766,"title":2767,"date":2526,"chapter":2768,"chapterSort":2769,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-2-nullptr","wiki/2023-10-05-Cplusplus教学/ch18-2-nullptr","nullptr","18.2",18020000,{"path":2771,"stem":2772,"title":2773,"date":2526,"chapter":2774,"chapterSort":2775,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-20-std-filesystem","wiki/2023-10-05-Cplusplus教学/ch18-20-std-filesystem","std::filesystem","18.20",18200000,{"path":2777,"stem":2778,"title":2779,"date":2526,"chapter":2780,"chapterSort":2781,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-21-modules-jian-jie","wiki/2023-10-05-Cplusplus教学/ch18-21-modules简介","modules 简介","18.21",18210000,{"path":2783,"stem":2784,"title":2785,"date":2526,"chapter":2786,"chapterSort":2787,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-3-using","wiki/2023-10-05-Cplusplus教学/ch18-3-using","using","18.3",18030000,{"path":2789,"stem":2790,"title":2791,"date":2526,"chapter":2792,"chapterSort":2793,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-4-enum-class","wiki/2023-10-05-Cplusplus教学/ch18-4-enum-class","enum class","18.4",18040000,{"path":2795,"stem":2796,"title":2797,"date":2526,"chapter":2798,"chapterSort":2799,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-5-fan-wei-for-xun-huan","wiki/2023-10-05-Cplusplus教学/ch18-5-范围for循环","范围 for 循环","18.5",18050000,{"path":2801,"stem":2802,"title":2803,"date":2526,"chapter":2804,"chapterSort":2805,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-6-jie-gou-hua-bang-ding","wiki/2023-10-05-Cplusplus教学/ch18-6-结构化绑定","结构化绑定","18.6",18060000,{"path":2807,"stem":2808,"title":2809,"date":2526,"chapter":2810,"chapterSort":2811,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-7-constexpr","wiki/2023-10-05-Cplusplus教学/ch18-7-constexpr","constexpr","18.7",18070000,{"path":2813,"stem":2814,"title":2815,"date":2526,"chapter":2816,"chapterSort":2817,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-8-raii","wiki/2023-10-05-Cplusplus教学/ch18-8-RAII","RAII","18.8",18080000,{"path":2819,"stem":2820,"title":2821,"date":2526,"chapter":2822,"chapterSort":2823,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-9-zhi-neng-zhi-zhen","wiki/2023-10-05-Cplusplus教学/ch18-9-智能指针","智能指针","18.9",18090000,{"path":2825,"stem":2826,"title":2827,"date":2526,"chapter":2828,"chapterSort":2829,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-xian-dai-c","wiki/2023-10-05-Cplusplus教学/ch18-现代C++","现代C++","18",18000000,{"path":2831,"stem":2832,"title":2833,"date":2526,"chapter":2834,"chapterSort":2835,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-1-ding-shi-qi-yu-yi-bu-io","wiki/2023-10-05-Cplusplus教学/ch19-1-1-定时器与异步IO","定时器与异步 IO","19.1.1",19010100,{"path":2837,"stem":2838,"title":2839,"date":2526,"chapter":2840,"chapterSort":2841,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-2-boost-asio-ji-chu","wiki/2023-10-05-Cplusplus教学/ch19-1-2-Boost.Asio基础","Boost.Asio 基础","19.1.2",19010200,{"path":2843,"stem":2844,"title":2845,"date":2526,"chapter":2846,"chapterSort":2847,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-3-chuan-kou-tong-xin","wiki/2023-10-05-Cplusplus教学/ch19-1-3-串口通信","串口通信","19.1.3",19010300,{"path":2849,"stem":2850,"title":2851,"date":2526,"chapter":2852,"chapterSort":2853,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-4-tcp-tong-xin","wiki/2023-10-05-Cplusplus教学/ch19-1-4-TCP通信","TCP 通信","19.1.4",19010400,{"path":2855,"stem":2856,"title":2857,"date":2526,"chapter":2858,"chapterSort":2859,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-5-udp-tong-xin","wiki/2023-10-05-Cplusplus教学/ch19-1-5-UDP通信","UDP 通信","19.1.5",19010500,{"path":2861,"stem":2862,"title":2863,"date":2526,"chapter":2864,"chapterSort":2865,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-6-ji-qi-ren-gong-cheng-xie-fa-yu-ros2-ji-cheng","wiki/2023-10-05-Cplusplus教学/ch19-1-6-机器人工程写法与ROS2集成","机器人工程写法与 ROS2 集成","19.1.6",19010600,{"path":2867,"stem":2868,"title":2869,"date":2526,"chapter":2870,"chapterSort":2871,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-1-boost-asio-yi-bu-io-ku","wiki/2023-10-05-Cplusplus教学/ch19-1-Boost.Asio异步IO库","Boost.Asio异步IO库","19.1",19010000,{"path":2873,"stem":2874,"title":2875,"date":2526,"chapter":2876,"chapterSort":2877,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-2-eigen-xian-xing-dai-shu-ku","wiki/2023-10-05-Cplusplus教学/ch19-2-Eigen线性代数库","Eigen线性代数库","19.2",19020000,{"path":2879,"stem":2880,"title":2881,"date":2526,"chapter":2882,"chapterSort":2883,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-3-opencv-ji-suan-ji-shi-jue-ku","wiki/2023-10-05-Cplusplus教学/ch19-3-OpenCV计算机视觉库","OpenCV计算机视觉库","19.3",19030000,{"path":2885,"stem":2886,"title":2887,"date":2526,"chapter":2888,"chapterSort":2889,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-4-pcl-dian-yun-ku","wiki/2023-10-05-Cplusplus教学/ch19-4-PCL点云库","PCL点云库","19.4",19040000,{"path":2891,"stem":2892,"title":2893,"date":2526,"chapter":2894,"chapterSort":2895,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-5-sophus-li-qun-li-dai-shu-ku","wiki/2023-10-05-Cplusplus教学/ch19-5-Sophus李群李代数库","Sophus 李群李代数库","19.5",19050000,{"path":2897,"stem":2898,"title":2899,"date":2526,"chapter":2900,"chapterSort":2901,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-chang-yong-ku","wiki/2023-10-05-Cplusplus教学/ch19-常用库","常用库学习","19",19000000,{"path":2903,"stem":2904,"title":2905,"date":2526,"chapter":299,"chapterSort":2906,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch2-shu-ju-lei-xing-yu-shu-ju-cun-fang","wiki/2023-10-05-Cplusplus教学/ch2-数据类型与数据存放","数据类型与数据存放",2000000,{"path":2908,"stem":2909,"title":2910,"date":2526,"chapter":304,"chapterSort":2911,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch3-shu-ru-shu-chu","wiki/2023-10-05-Cplusplus教学/ch3-输入输出","输入输出",3000000,{"path":2913,"stem":2914,"title":2915,"date":2526,"chapter":509,"chapterSort":2916,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch4-yun-suan-fu","wiki/2023-10-05-Cplusplus教学/ch4-运算符","运算符",4000000,{"path":2918,"stem":2919,"title":2920,"date":2526,"chapter":514,"chapterSort":2921,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch5-cheng-xu-liu-cheng-jie-gou","wiki/2023-10-05-Cplusplus教学/ch5-程序流程结构","程序流程结构",5000000,{"path":2923,"stem":2924,"title":2925,"date":2526,"chapter":2926,"chapterSort":2927,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch6-shu-zu","wiki/2023-10-05-Cplusplus教学/ch6-数组","数组","6",6000000,{"path":2929,"stem":2930,"title":2931,"date":2526,"chapter":2932,"chapterSort":2933,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch7-han-shu-yu-tou-wen-jian","wiki/2023-10-05-Cplusplus教学/ch7-函数与头文件","函数与头文件","7",7000000,{"path":2935,"stem":2936,"title":2937,"date":2526,"chapter":2938,"chapterSort":2939,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch8-zhi-zhen","wiki/2023-10-05-Cplusplus教学/ch8-指针","指针","8",8000000,{"path":2941,"stem":2942,"title":2943,"date":2526,"chapter":2944,"chapterSort":2945,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":2533},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch9-jie-gou-ti-yu-gong-yong-ti","wiki/2023-10-05-Cplusplus教学/ch9-结构体与共用体","结构体与共用体","9",9000000,{"path":2529,"stem":2947,"title":2948,"date":2526,"chapter":2534,"chapterSort":2949,"docKey":2528,"docRoot":2529,"docTitle":2530,"isWikiDoc":268,"isWikiIndex":268},"wiki/2023-10-05-Cplusplus教学/index","C/C++教程",0,{"variants":2951},[2952,2955,2958,2961,2964],{"path":2953,"localeSlug":2954,"i18nKey":2532},"/en-us/wiki/2023-10-05-cplusplus-jiao-xue/ch18-10-you-zhi-yin-yong-he-yi-dong-yu-yi","en-us",{"path":2956,"localeSlug":2957,"i18nKey":2532},"/zh-hant/wiki/2023-10-05-cplusplus-jiao-xue/ch18-10-you-zhi-yin-yong-he-yi-dong-yu-yi","zh-hant",{"path":2959,"localeSlug":2960,"i18nKey":2532},"/zh-hk/wiki/2023-10-05-cplusplus-jiao-xue/ch18-10-you-zhi-yin-yong-he-yi-dong-yu-yi","zh-hk",{"path":2962,"localeSlug":2963,"i18nKey":2532},"/zh-tw/wiki/2023-10-05-cplusplus-jiao-xue/ch18-10-you-zhi-yin-yong-he-yi-dong-yu-yi","zh-tw",{"path":2523,"localeSlug":2537,"i18nKey":2532},[2953,2535,2956,2535,2959,2535,2962,2535,2523,2535],1780663036175]