[{"data":1,"prerenderedAt":4447},["ShallowReactive",2],{"wiki-page-\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi":3,"wiki-doc-items-\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi":4027,"language-switcher-data-\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi":4431,"wiki-i18n-paths-\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi":4446},{"id":4,"title":5,"body":6,"canonicalPath":4010,"chapterDepth":31,"chapterOrder":4011,"date":4012,"description":23,"docI18nKey":4013,"docKey":4014,"docRoot":4015,"docTitle":4016,"extension":4017,"i18nKey":4018,"isBlogPost":4019,"isWikiDoc":268,"isWikiIndex":4019,"layout":4020,"legacyPath":4021,"locale":4022,"localeSlug":4023,"meta":4024,"navigation":268,"path":4010,"seo":4025,"sourcePath":4021,"sourceStem":4018,"stem":4018,"wikiDepth":31,"__hash__":4026},"content\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1000-右值引用和移动语义.md","右值引用和移动语义",{"type":7,"value":8,"toc":3988},"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,1457,1460,1484,1490,1497,1506,1568,1571,1615,1618,1637,1640,1657,1664,1722,1725,1779,1787,1823,1826,1835,1853,1859,1867,1870,1929,1932,1948,1959,1966,1976,1979,1999,2004,2025,2028,2088,2091,2097,2100,2115,2118,2122,2125,2139,2142,2202,2205,2219,2222,2228,2231,2234,2237,2252,2255,2282,2285,2291,2294,2306,2309,2316,2322,2325,2338,2349,2357,2363,2399,2408,2423,2443,2446,2449,2480,2483,2486,2489,2582,2585,2653,2656,2661,2664,2763,2766,2769,2800,2810,2812,2861,2864,2887,2893,2913,2916,2926,2947,2951,3374,3378,3384,3386,3389,3392,3480,3484,3496,3548,3562,3566,3647,3650,3655,3728,3731,3736,3792,3795,3800,3864,3871,3876,3897,3904,3907,3950,3953,3978,3981,3984],[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    \u002F\u002F ... 填充数据 ...\n    return v;  \u002F\u002F 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","    \u002F\u002F ... 填充数据 ...\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},"  \u002F\u002F 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>  \u002F\u002F 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},"  \u002F\u002F 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;           \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",[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},"           \u002F\u002F 右值引用绑定到临时值\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},"  \u002F\u002F 绑定到表达式结果\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},"\u002F\u002F 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},"  \u002F\u002F 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},"左值\u002F右值",[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    \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",[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},"    \u002F\u002F 拷贝（两份独立的数据）\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},"  \u002F\u002F 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},"    \u002F\u002F 移动（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},"  \u002F\u002F 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> \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",[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}," \u002F\u002F 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},"  \u002F\u002F 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},"    \u002F\u002F 构造函数\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},"    \u002F\u002F 拷贝构造函数（深拷贝）\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},"    \u002F\u002F 移动构造函数（偷数据）\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},"  \u002F\u002F 让原对象安全析构\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},"    \u002F\u002F 拷贝：会触发深拷贝\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},"    \u002F\u002F 移动：数据被偷走，没有深拷贝！\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},[1447,1448,1450,1451,139,1454,1456],"h4",{"id":1449},"buffer-示例详解stdcopystdmove-与对象初始化","Buffer 示例详解：",[25,1452,1453],{},"std::copy",[25,1455,180],{}," 与对象初始化",[14,1458,1459],{},"示例 2 中最容易混淆的地方主要有三个：",[1461,1462,1463,1468,1473],"ol",{},[130,1464,1465,1467],{},[25,1466,1453],{}," 到底复制了什么；",[130,1469,1470,1472],{},[25,1471,180],{}," 到底做了什么；",[130,1474,1475,1476,1479,1480,1483],{},"为什么 ",[25,1477,1478],{},"Buffer b = a;"," 和 ",[25,1481,1482],{},"Buffer b(a);"," 都会调用拷贝构造函数。",[14,1485,1486,1487,1489],{},"下面结合 ",[25,1488,1068],{}," 类逐一说明。",[1491,1492,1494,1496],"h5",{"id":1493},"stdcopy真正复制一段元素",[25,1495,1453],{},"：真正复制一段元素",[14,1498,1499,1501,1502,1505],{},[25,1500,1453],{}," 定义在 ",[25,1503,1504],{},"\u003Calgorithm>"," 中，常见形式可以简化写成：",[18,1507,1509],{"className":20,"code":1508,"language":22,"meta":23,"style":23},"template\u003Cclass InputIt, class OutputIt>\nOutputIt std::copy(InputIt first, InputIt last, OutputIt destination);\n",[25,1510,1511,1533],{"__ignoreMap":23},[28,1512,1513,1516,1518,1520,1523,1525,1527,1530],{"class":30,"line":31},[28,1514,1515],{"class":48},"template",[28,1517,45],{"class":38},[28,1519,838],{"class":48},[28,1521,1522],{"class":34}," InputIt",[28,1524,296],{"class":38},[28,1526,838],{"class":48},[28,1528,1529],{"class":34}," OutputIt",[28,1531,1532],{"class":38},">\n",[28,1534,1535,1538,1540,1542,1544,1546,1549,1552,1554,1556,1559,1561,1563,1566],{"class":30,"line":61},[28,1536,1537],{"class":34},"OutputIt",[28,1539,323],{"class":34},[28,1541,39],{"class":38},[28,1543,1007],{"class":34},[28,1545,82],{"class":38},[28,1547,1548],{"class":34},"InputIt",[28,1550,1551],{"class":888}," first",[28,1553,296],{"class":38},[28,1555,1548],{"class":34},[28,1557,1558],{"class":888}," last",[28,1560,296],{"class":38},[28,1562,1537],{"class":34},[28,1564,1565],{"class":888}," destination",[28,1567,89],{"class":38},[14,1569,1570],{},"三个参数的含义如下：",[340,1572,1573,1583],{},[343,1574,1575],{},[346,1576,1577,1580],{},[349,1578,1579],{"align":351},"参数",[349,1581,1582],{"align":351},"含义",[360,1584,1585,1595,1605],{},[346,1586,1587,1592],{},[365,1588,1589],{"align":351},[25,1590,1591],{},"first",[365,1593,1594],{"align":351},"源数据的起始位置",[346,1596,1597,1602],{},[365,1598,1599],{"align":351},[25,1600,1601],{},"last",[365,1603,1604],{"align":351},"源数据的结束位置，但不包含该位置",[346,1606,1607,1612],{},[365,1608,1609],{"align":351},[25,1610,1611],{},"destination",[365,1613,1614],{"align":351},"目标区域的起始位置",[14,1616,1617],{},"示例中的代码是：",[18,1619,1621],{"className":20,"code":1620,"language":22,"meta":23,"style":23},"std::copy(other.data, other.data + size, data);\n",[25,1622,1623],{"__ignoreMap":23},[28,1624,1625,1627,1629,1631,1633,1635],{"class":30,"line":31},[28,1626,35],{"class":34},[28,1628,39],{"class":38},[28,1630,1007],{"class":34},[28,1632,1010],{"class":38},[28,1634,257],{"class":48},[28,1636,1015],{"class":38},[14,1638,1639],{},"可以理解为：",[1641,1642,1643],"blockquote",{},[14,1644,1645,1646,1649,1650,1653,1654,1656],{},"从 ",[25,1647,1648],{},"other.data"," 开始，复制到 ",[25,1651,1652],{},"other.data + size"," 之前为止，并把结果写入 ",[25,1655,895],{}," 指向的内存。",[14,1658,1659,1660,1663],{},"假设 ",[25,1661,1662],{},"size == 3","，它大致等价于：",[18,1665,1667],{"className":20,"code":1666,"language":22,"meta":23,"style":23},"data[0] = other.data[0];\ndata[1] = other.data[1];\ndata[2] = other.data[2];\n",[25,1668,1669,1690,1706],{"__ignoreMap":23},[28,1670,1671,1674,1677,1680,1682,1685,1687],{"class":30,"line":31},[28,1672,1673],{"class":38},"data[",[28,1675,1676],{"class":85},"0",[28,1678,1679],{"class":38},"] ",[28,1681,227],{"class":48},[28,1683,1684],{"class":38}," other.data[",[28,1686,1676],{"class":85},[28,1688,1689],{"class":38},"];\n",[28,1691,1692,1694,1696,1698,1700,1702,1704],{"class":30,"line":61},[28,1693,1673],{"class":38},[28,1695,293],{"class":85},[28,1697,1679],{"class":38},[28,1699,227],{"class":48},[28,1701,1684],{"class":38},[28,1703,293],{"class":85},[28,1705,1689],{"class":38},[28,1707,1708,1710,1712,1714,1716,1718,1720],{"class":30,"line":67},[28,1709,1673],{"class":38},[28,1711,299],{"class":85},[28,1713,1679],{"class":38},[28,1715,227],{"class":48},[28,1717,1684],{"class":38},[28,1719,299],{"class":85},[28,1721,1689],{"class":38},[14,1723,1724],{},"也可以手写成循环：",[18,1726,1728],{"className":20,"code":1727,"language":22,"meta":23,"style":23},"for (size_t i = 0; i \u003C size; ++i)\n{\n    data[i] = other.data[i];\n}\n",[25,1729,1730,1761,1765,1775],{"__ignoreMap":23},[28,1731,1732,1735,1738,1740,1743,1745,1747,1750,1752,1755,1758],{"class":30,"line":31},[28,1733,1734],{"class":48},"for",[28,1736,1737],{"class":38}," (",[28,1739,885],{"class":48},[28,1741,1742],{"class":38}," i ",[28,1744,227],{"class":48},[28,1746,767],{"class":85},[28,1748,1749],{"class":38},"; i ",[28,1751,45],{"class":48},[28,1753,1754],{"class":38}," size; ",[28,1756,1757],{"class":48},"++",[28,1759,1760],{"class":38},"i)\n",[28,1762,1763],{"class":30,"line":61},[28,1764,64],{"class":38},[28,1766,1767,1770,1772],{"class":30,"line":67},[28,1768,1769],{"class":38},"    data[i] ",[28,1771,227],{"class":48},[28,1773,1774],{"class":38}," other.data[i];\n",[28,1776,1777],{"class":30,"line":92},[28,1778,114],{"class":38},[14,1780,1781,1783,1784,1786],{},[25,1782,1453],{}," 的返回值是目标区域复制结束后的下一个位置。这里复制了 ",[25,1785,587],{}," 个元素，因此：",[18,1788,1790],{"className":20,"code":1789,"language":22,"meta":23,"style":23},"int* end = std::copy(other.data, other.data + size, data);\n\n\u002F\u002F 此时 end 等于 data + size\n",[25,1791,1792,1814,1818],{"__ignoreMap":23},[28,1793,1794,1797,1800,1802,1804,1806,1808,1810,1812],{"class":30,"line":31},[28,1795,1796],{"class":48},"int*",[28,1798,1799],{"class":38}," end ",[28,1801,227],{"class":48},[28,1803,323],{"class":34},[28,1805,39],{"class":38},[28,1807,1007],{"class":34},[28,1809,1010],{"class":38},[28,1811,257],{"class":48},[28,1813,1015],{"class":38},[28,1815,1816],{"class":30,"line":61},[28,1817,269],{"emptyLinePlaceholder":268},[28,1819,1820],{"class":30,"line":67},[28,1821,1822],{"class":95},"\u002F\u002F 此时 end 等于 data + size\n",[14,1824,1825],{},"本例不需要继续使用这个位置，所以直接忽略了返回值。",[14,1827,1828,1829,1831,1832,1834],{},"需要注意，",[25,1830,1453],{}," 不会自动为目标区域申请内存。调用它之前，",[25,1833,895],{}," 必须已经指向足够大的有效内存。本例在成员初始化列表中已经完成了申请：",[18,1836,1838],{"className":20,"code":1837,"language":22,"meta":23,"style":23},"data(new int[other.size])\n",[25,1839,1840],{"__ignoreMap":23},[28,1841,1842,1844,1846,1848,1850],{"class":30,"line":31},[28,1843,895],{"class":34},[28,1845,82],{"class":38},[28,1847,900],{"class":48},[28,1849,903],{"class":48},[28,1851,1852],{"class":38},"[other.size])\n",[1491,1854,1856,1858],{"id":1855},"stdmove本身并不移动数据",[25,1857,180],{},"：本身并不移动数据",[14,1860,1861,1501,1863,1866],{},[25,1862,180],{},[25,1864,1865],{},"\u003Cutility>"," 中。它的作用不是复制数据，也不是搬运数据，而是把一个表达式转换成可以绑定到右值引用的形式。",[14,1868,1869],{},"它的函数模板可以简化理解为：",[18,1871,1873],{"className":20,"code":1872,"language":22,"meta":23,"style":23},"template\u003Cclass T>\nstd::remove_reference_t\u003CT>&& std::move(T&& value) noexcept;\n",[25,1874,1875,1888],{"__ignoreMap":23},[28,1876,1877,1879,1881,1883,1886],{"class":30,"line":31},[28,1878,1515],{"class":48},[28,1880,45],{"class":38},[28,1882,838],{"class":48},[28,1884,1885],{"class":34}," T",[28,1887,1532],{"class":38},[28,1889,1890,1892,1894,1897,1899,1902,1905,1907,1909,1911,1913,1915,1917,1919,1922,1924,1927],{"class":30,"line":61},[28,1891,35],{"class":34},[28,1893,39],{"class":38},[28,1895,1896],{"class":85},"remove_reference_t",[28,1898,45],{"class":38},[28,1900,1901],{"class":34},"T",[28,1903,1904],{"class":38},">",[28,1906,246],{"class":48},[28,1908,323],{"class":34},[28,1910,39],{"class":38},[28,1912,328],{"class":34},[28,1914,82],{"class":38},[28,1916,1901],{"class":34},[28,1918,246],{"class":48},[28,1920,1921],{"class":888}," value",[28,1923,1075],{"class":38},[28,1925,1926],{"class":48},"noexcept",[28,1928,566],{"class":38},[14,1930,1931],{},"对于下面这句代码：",[18,1933,1935],{"className":20,"code":1934,"language":22,"meta":23,"style":23},"std::move(buf2)\n",[25,1936,1937],{"__ignoreMap":23},[28,1938,1939,1941,1943,1945],{"class":30,"line":31},[28,1940,35],{"class":34},[28,1942,39],{"class":38},[28,1944,328],{"class":34},[28,1946,1947],{"class":38},"(buf2)\n",[14,1949,1950,1951,1954,1955,1958],{},"参数是 ",[25,1952,1953],{},"buf2","，返回结果可以简单理解为一个 ",[25,1956,1957],{},"Buffer&&","。它相当于告诉编译器：",[1641,1960,1961],{},[14,1962,1963,1965],{},[25,1964,1953],{}," 原来的资源可以被转移，不必继续保留原来的内容。",[14,1967,1968,1969,1972,1973,1975],{},"但 ",[25,1970,1971],{},"std::move(buf2)"," 这一表达式本身不会修改 ",[25,1974,1953],{},"。真正转移资源的是随后被调用的移动构造函数或移动赋值运算符。",[14,1977,1978],{},"例如：",[18,1980,1982],{"className":20,"code":1981,"language":22,"meta":23,"style":23},"Buffer buf3 = std::move(buf2);\n",[25,1983,1984],{"__ignoreMap":23},[28,1985,1986,1989,1991,1993,1995,1997],{"class":30,"line":31},[28,1987,1988],{"class":38},"Buffer buf3 ",[28,1990,227],{"class":48},[28,1992,323],{"class":34},[28,1994,39],{"class":38},[28,1996,328],{"class":34},[28,1998,1354],{"class":38},[14,2000,2001,2003],{},[25,2002,1971],{}," 使右侧表达式可以匹配：",[18,2005,2007],{"className":20,"code":2006,"language":22,"meta":23,"style":23},"Buffer(Buffer&& other) noexcept;\n",[25,2008,2009],{"__ignoreMap":23},[28,2010,2011,2013,2016,2018,2021,2023],{"class":30,"line":31},[28,2012,1068],{"class":34},[28,2014,2015],{"class":38},"(Buffer",[28,2017,246],{"class":48},[28,2019,2020],{"class":38}," other) ",[28,2022,1926],{"class":48},[28,2024,566],{"class":38},[14,2026,2027],{},"于是编译器调用移动构造函数，由移动构造函数真正接管指针：",[18,2029,2031],{"className":20,"code":2030,"language":22,"meta":23,"style":23},"Buffer(Buffer&& other) noexcept\n    : data(other.data), size(other.size)\n{\n    other.data = nullptr;\n    other.size = 0;\n}\n",[25,2032,2033,2045,2058,2062,2073,2084],{"__ignoreMap":23},[28,2034,2035,2037,2039,2041,2043],{"class":30,"line":31},[28,2036,1068],{"class":34},[28,2038,2015],{"class":38},[28,2040,246],{"class":48},[28,2042,2020],{"class":38},[28,2044,1078],{"class":48},[28,2046,2047,2050,2052,2054,2056],{"class":30,"line":61},[28,2048,2049],{"class":38},"    : ",[28,2051,895],{"class":34},[28,2053,1089],{"class":38},[28,2055,587],{"class":34},[28,2057,994],{"class":38},[28,2059,2060],{"class":30,"line":67},[28,2061,64],{"class":38},[28,2063,2064,2067,2069,2071],{"class":30,"line":92},[28,2065,2066],{"class":38},"    other.data ",[28,2068,227],{"class":48},[28,2070,1109],{"class":85},[28,2072,566],{"class":38},[28,2074,2075,2078,2080,2082],{"class":30,"line":99},[28,2076,2077],{"class":38},"    other.size ",[28,2079,227],{"class":48},[28,2081,767],{"class":85},[28,2083,566],{"class":38},[28,2085,2086],{"class":30,"line":111},[28,2087,114],{"class":38},[14,2089,2090],{},"因此，可以把它们的职责记成：",[18,2092,2095],{"className":2093,"code":2094,"language":786,"meta":23},[784],"std::copy：真正复制元素\nstd::move：把对象转换成“允许被移动”的表达式\n移动构造函数：真正负责转移资源\n",[25,2096,2094],{"__ignoreMap":23},[14,2098,2099],{},"单独写下面这句通常没有实际效果：",[18,2101,2103],{"className":20,"code":2102,"language":22,"meta":23,"style":23},"std::move(buf2);\n",[25,2104,2105],{"__ignoreMap":23},[28,2106,2107,2109,2111,2113],{"class":30,"line":31},[28,2108,35],{"class":34},[28,2110,39],{"class":38},[28,2112,328],{"class":34},[28,2114,1354],{"class":38},[14,2116,2117],{},"因为返回的右值引用没有被用于构造、赋值或函数传参，移动构造函数也就不会被调用。",[1491,2119,2121],{"id":2120},"拷贝构造为什么是深拷贝","拷贝构造为什么是“深拷贝”",[14,2123,2124],{},"下面这句会调用拷贝构造函数：",[18,2126,2128],{"className":20,"code":2127,"language":22,"meta":23,"style":23},"Buffer buf2 = buf1;\n",[25,2129,2130],{"__ignoreMap":23},[28,2131,2132,2135,2137],{"class":30,"line":31},[28,2133,2134],{"class":38},"Buffer buf2 ",[28,2136,227],{"class":48},[28,2138,1294],{"class":38},[14,2140,2141],{},"对应的构造函数是：",[18,2143,2145],{"className":20,"code":2144,"language":22,"meta":23,"style":23},"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",[25,2146,2147,2162,2180,2184,2198],{"__ignoreMap":23},[28,2148,2149,2151,2153,2155,2157,2159],{"class":30,"line":31},[28,2150,1068],{"class":34},[28,2152,82],{"class":38},[28,2154,967],{"class":48},[28,2156,970],{"class":38},[28,2158,973],{"class":48},[28,2160,2161],{"class":38}," other)\n",[28,2163,2164,2166,2168,2170,2172,2174,2176,2178],{"class":30,"line":61},[28,2165,2049],{"class":38},[28,2167,895],{"class":34},[28,2169,82],{"class":38},[28,2171,900],{"class":48},[28,2173,903],{"class":48},[28,2175,989],{"class":38},[28,2177,587],{"class":34},[28,2179,994],{"class":38},[28,2181,2182],{"class":30,"line":67},[28,2183,64],{"class":38},[28,2185,2186,2188,2190,2192,2194,2196],{"class":30,"line":92},[28,2187,70],{"class":34},[28,2189,39],{"class":38},[28,2191,1007],{"class":34},[28,2193,1010],{"class":38},[28,2195,257],{"class":48},[28,2197,1015],{"class":38},[28,2199,2200],{"class":30,"line":99},[28,2201,114],{"class":38},[14,2203,2204],{},"它做了两件事：",[1461,2206,2207,2213],{},[130,2208,2209,2210,2212],{},"为 ",[25,2211,1953],{}," 重新申请一块独立的数组内存；",[130,2214,2215,2216,2218],{},"把 ",[25,2217,1265],{}," 数组中的每个元素复制到新内存中。",[14,2220,2221],{},"拷贝完成后，两者保存的内容相同，但管理的是不同的内存：",[18,2223,2226],{"className":2224,"code":2225,"language":786,"meta":23},[784],"buf1.data ──> [buf1 自己的 1000 个 int]\n\nbuf2.data ──> [buf2 自己的 1000 个 int]\n",[25,2227,2225],{"__ignoreMap":23},[14,2229,2230],{},"所以销毁或修改其中一个对象，不会直接影响另一个对象，这就是深拷贝。",[1491,2232,2233],{"id":2233},"移动构造为什么要清空原对象",[14,2235,2236],{},"移动构造函数没有重新申请数组，也没有复制 1000 个元素，而是直接接管指针：",[18,2238,2240],{"className":20,"code":2239,"language":22,"meta":23,"style":23},"data(other.data), size(other.size)\n",[25,2241,2242],{"__ignoreMap":23},[28,2243,2244,2246,2248,2250],{"class":30,"line":31},[28,2245,895],{"class":34},[28,2247,1089],{"class":38},[28,2249,587],{"class":34},[28,2251,994],{"class":38},[14,2253,2254],{},"接管后必须执行：",[18,2256,2258],{"className":20,"code":2257,"language":22,"meta":23,"style":23},"other.data = nullptr;\nother.size = 0;\n",[25,2259,2260,2271],{"__ignoreMap":23},[28,2261,2262,2265,2267,2269],{"class":30,"line":31},[28,2263,2264],{"class":38},"other.data ",[28,2266,227],{"class":48},[28,2268,1109],{"class":85},[28,2270,566],{"class":38},[28,2272,2273,2276,2278,2280],{"class":30,"line":61},[28,2274,2275],{"class":38},"other.size ",[28,2277,227],{"class":48},[28,2279,767],{"class":85},[28,2281,566],{"class":38},[14,2283,2284],{},"否则新对象和原对象会同时保存同一个指针：",[18,2286,2289],{"className":2287,"code":2288,"language":786,"meta":23},[784],"buf2.data ─┐\n           ├──> [同一块数组内存]\nbuf3.data ─┘\n",[25,2290,2288],{"__ignoreMap":23},[14,2292,2293],{},"两个对象析构时都会执行：",[18,2295,2297],{"className":20,"code":2296,"language":22,"meta":23,"style":23},"delete[] data;\n",[25,2298,2299],{"__ignoreMap":23},[28,2300,2301,2304],{"class":30,"line":31},[28,2302,2303],{"class":48},"delete[]",[28,2305,853],{"class":38},[14,2307,2308],{},"这样就可能对同一块内存释放两次，产生未定义行为。",[14,2310,2311,2312,2315],{},"把原对象的指针设为 ",[25,2313,2314],{},"nullptr"," 后，所有权关系变成：",[18,2317,2320],{"className":2318,"code":2319,"language":786,"meta":23},[784],"buf2.data = nullptr\n\nbuf3.data ──> [原来由 buf2 管理的数组内存]\n",[25,2321,2319],{"__ignoreMap":23},[14,2323,2324],{},"而下面的操作是安全的：",[18,2326,2328],{"className":20,"code":2327,"language":22,"meta":23,"style":23},"delete[] nullptr;\n",[25,2329,2330],{"__ignoreMap":23},[28,2331,2332,2334,2336],{"class":30,"line":31},[28,2333,2303],{"class":48},[28,2335,1109],{"class":85},[28,2337,566],{"class":38},[14,2339,2340,2341,2343,2344,2346,2347,143],{},"所以移动后的 ",[25,2342,1953],{}," 仍然可以正常析构。在这个自定义实现中，我们还明确把它的 ",[25,2345,587],{}," 设成了 ",[25,2348,1676],{},[1491,2350,1475,2352,2354,2355],{"id":2351},"为什么-buffer-b-a-等同于-buffer-ba",[25,2353,1478],{}," 等同于 ",[25,2356,1482],{},[14,2358,2359,2360,780],{},"下面两种写法都在创建一个新的对象 ",[25,2361,2362],{},"b",[18,2364,2366],{"className":20,"code":2365,"language":22,"meta":23,"style":23},"Buffer b = a;  \u002F\u002F 拷贝初始化\nBuffer b(a);   \u002F\u002F 直接初始化\n",[25,2367,2368,2381],{"__ignoreMap":23},[28,2369,2370,2373,2375,2378],{"class":30,"line":31},[28,2371,2372],{"class":38},"Buffer b ",[28,2374,227],{"class":48},[28,2376,2377],{"class":38}," a;",[28,2379,2380],{"class":95},"  \u002F\u002F 拷贝初始化\n",[28,2382,2383,2385,2388,2390,2393,2396],{"class":30,"line":61},[28,2384,1068],{"class":34},[28,2386,2387],{"class":34}," b",[28,2389,82],{"class":38},[28,2391,2392],{"class":34},"a",[28,2394,2395],{"class":38},");",[28,2397,2398],{"class":95},"   \u002F\u002F 直接初始化\n",[14,2400,2401,2402,2404,2405,2407],{},"虽然第一种写法中出现了等号，但这里的 ",[25,2403,227],{}," 不是赋值运算符，因为 ",[25,2406,2362],{}," 在这条语句执行前还不存在，它正在被创建。",[14,2409,2410,2411,2413,2414,2416,2417,2419,2420,2422],{},"两种写法都会寻找一个能够使用 ",[25,2412,2392],{}," 来构造 ",[25,2415,2362],{}," 的构造函数。由于 ",[25,2418,2392],{}," 的类型是 ",[25,2421,1068],{},"，所以都会匹配：",[18,2424,2426],{"className":20,"code":2425,"language":22,"meta":23,"style":23},"Buffer(const Buffer& other);\n",[25,2427,2428],{"__ignoreMap":23},[28,2429,2430,2432,2434,2436,2438,2440],{"class":30,"line":31},[28,2431,1068],{"class":34},[28,2433,82],{"class":38},[28,2435,967],{"class":48},[28,2437,970],{"class":38},[28,2439,973],{"class":48},[28,2441,2442],{"class":38}," other);\n",[14,2444,2445],{},"也就是拷贝构造函数。",[14,2447,2448],{},"可以把它们理解成：",[18,2450,2452],{"className":20,"code":2451,"language":22,"meta":23,"style":23},"Buffer b = a;  \u002F\u002F 创建 b，并用 a 初始化\nBuffer b(a);   \u002F\u002F 创建 b，并用 a 初始化\n",[25,2453,2454,2465],{"__ignoreMap":23},[28,2455,2456,2458,2460,2462],{"class":30,"line":31},[28,2457,2372],{"class":38},[28,2459,227],{"class":48},[28,2461,2377],{"class":38},[28,2463,2464],{"class":95},"  \u002F\u002F 创建 b，并用 a 初始化\n",[28,2466,2467,2469,2471,2473,2475,2477],{"class":30,"line":61},[28,2468,1068],{"class":34},[28,2470,2387],{"class":34},[28,2472,82],{"class":38},[28,2474,2392],{"class":34},[28,2476,2395],{"class":38},[28,2478,2479],{"class":95},"   \u002F\u002F 创建 b，并用 a 初始化\n",[14,2481,2482],{},"对于本例，这两种写法的效果相同。",[1491,2484,2485],{"id":2485},"构造和赋值的判断方法",[14,2487,2488],{},"判断调用的是构造函数还是赋值运算符，关键不在于有没有等号，而在于左侧对象是否正在被创建。",[18,2490,2492],{"className":20,"code":2491,"language":22,"meta":23,"style":23},"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",[25,2493,2494,2507,2511,2522,2538,2542,2561],{"__ignoreMap":23},[28,2495,2496,2498,2501,2503,2505],{"class":30,"line":31},[28,2497,1068],{"class":34},[28,2499,2500],{"class":34}," a",[28,2502,82],{"class":38},[28,2504,1270],{"class":85},[28,2506,89],{"class":38},[28,2508,2509],{"class":30,"line":61},[28,2510,269],{"emptyLinePlaceholder":268},[28,2512,2513,2515,2517,2519],{"class":30,"line":67},[28,2514,2372],{"class":38},[28,2516,227],{"class":48},[28,2518,2377],{"class":38},[28,2520,2521],{"class":95},"  \u002F\u002F b 正在创建：调用拷贝构造函数\n",[28,2523,2524,2526,2529,2531,2533,2535],{"class":30,"line":92},[28,2525,1068],{"class":34},[28,2527,2528],{"class":34}," c",[28,2530,82],{"class":38},[28,2532,2392],{"class":34},[28,2534,2395],{"class":38},[28,2536,2537],{"class":95},"   \u002F\u002F c 正在创建：调用拷贝构造函数\n",[28,2539,2540],{"class":30,"line":99},[28,2541,269],{"emptyLinePlaceholder":268},[28,2543,2544,2547,2549,2551,2553,2555,2558],{"class":30,"line":111},[28,2545,2546],{"class":38},"Buffer d ",[28,2548,227],{"class":48},[28,2550,323],{"class":34},[28,2552,39],{"class":38},[28,2554,328],{"class":34},[28,2556,2557],{"class":38},"(a);",[28,2559,2560],{"class":95},"  \u002F\u002F d 正在创建：调用移动构造函数\n",[28,2562,2563,2565,2568,2570,2572,2574,2576,2579],{"class":30,"line":519},[28,2564,1068],{"class":34},[28,2566,2567],{"class":34}," e",[28,2569,82],{"class":38},[28,2571,35],{"class":34},[28,2573,39],{"class":38},[28,2575,328],{"class":34},[28,2577,2578],{"class":38},"(b));",[28,2580,2581],{"class":95},"   \u002F\u002F e 正在创建：调用移动构造函数\n",[14,2583,2584],{},"如果对象已经存在，再使用等号，才是赋值：",[18,2586,2588],{"className":20,"code":2587,"language":22,"meta":23,"style":23},"Buffer x(100);\nBuffer y(200);\n\nx = y;             \u002F\u002F x 已存在：调用拷贝赋值运算符\nx = std::move(y);  \u002F\u002F x 已存在：调用移动赋值运算符\n",[25,2589,2590,2604,2618,2622,2635],{"__ignoreMap":23},[28,2591,2592,2594,2597,2599,2602],{"class":30,"line":31},[28,2593,1068],{"class":34},[28,2595,2596],{"class":34}," x",[28,2598,82],{"class":38},[28,2600,2601],{"class":85},"100",[28,2603,89],{"class":38},[28,2605,2606,2608,2611,2613,2616],{"class":30,"line":61},[28,2607,1068],{"class":34},[28,2609,2610],{"class":34}," y",[28,2612,82],{"class":38},[28,2614,2615],{"class":85},"200",[28,2617,89],{"class":38},[28,2619,2620],{"class":30,"line":67},[28,2621,269],{"emptyLinePlaceholder":268},[28,2623,2624,2627,2629,2632],{"class":30,"line":92},[28,2625,2626],{"class":38},"x ",[28,2628,227],{"class":48},[28,2630,2631],{"class":38}," y;",[28,2633,2634],{"class":95},"             \u002F\u002F x 已存在：调用拷贝赋值运算符\n",[28,2636,2637,2639,2641,2643,2645,2647,2650],{"class":30,"line":99},[28,2638,2626],{"class":38},[28,2640,227],{"class":48},[28,2642,323],{"class":34},[28,2644,39],{"class":38},[28,2646,328],{"class":34},[28,2648,2649],{"class":38},"(y);",[28,2651,2652],{"class":95},"  \u002F\u002F x 已存在：调用移动赋值运算符\n",[14,2654,2655],{},"可以用一句话记忆：",[1641,2657,2658],{},[14,2659,2660],{},"对象正在“出生”时调用构造函数；对象已经存在，只是更换内容时调用赋值运算符。",[14,2662,2663],{},"对应关系如下：",[340,2665,2666,2679],{},[343,2667,2668],{},[346,2669,2670,2673,2676],{},[349,2671,2672],{"align":351},"写法",[349,2674,2675],{"align":351},"对象状态",[349,2677,2678],{"align":351},"调用的函数",[360,2680,2681,2695,2707,2721,2734,2749],{},[346,2682,2683,2687,2692],{},[365,2684,2685],{"align":351},[25,2686,1478],{},[365,2688,2689,2691],{"align":351},[25,2690,2362],{}," 正在创建",[365,2693,2694],{"align":351},"拷贝构造函数",[346,2696,2697,2701,2705],{},[365,2698,2699],{"align":351},[25,2700,1482],{},[365,2702,2703,2691],{"align":351},[25,2704,2362],{},[365,2706,2694],{"align":351},[346,2708,2709,2714,2718],{},[365,2710,2711],{"align":351},[25,2712,2713],{},"Buffer b = std::move(a);",[365,2715,2716,2691],{"align":351},[25,2717,2362],{},[365,2719,2720],{"align":351},"移动构造函数",[346,2722,2723,2728,2732],{},[365,2724,2725],{"align":351},[25,2726,2727],{},"Buffer b(std::move(a));",[365,2729,2730,2691],{"align":351},[25,2731,2362],{},[365,2733,2720],{"align":351},[346,2735,2736,2741,2746],{},[365,2737,2738],{"align":351},[25,2739,2740],{},"b = a;",[365,2742,2743,2745],{"align":351},[25,2744,2362],{}," 已经存在",[365,2747,2748],{"align":351},"拷贝赋值运算符",[346,2750,2751,2756,2760],{},[365,2752,2753],{"align":351},[25,2754,2755],{},"b = std::move(a);",[365,2757,2758,2745],{"align":351},[25,2759,2362],{},[365,2761,2762],{"align":351},"移动赋值运算符",[1491,2764,2765],{"id":2765},"拷贝初始化和直接初始化并非永远相同",[14,2767,2768],{},"从语法分类上看：",[18,2770,2772],{"className":20,"code":2771,"language":22,"meta":23,"style":23},"Buffer b = a;  \u002F\u002F copy-initialization，拷贝初始化\nBuffer b(a);   \u002F\u002F direct-initialization，直接初始化\n",[25,2773,2774,2785],{"__ignoreMap":23},[28,2775,2776,2778,2780,2782],{"class":30,"line":31},[28,2777,2372],{"class":38},[28,2779,227],{"class":48},[28,2781,2377],{"class":38},[28,2783,2784],{"class":95},"  \u002F\u002F copy-initialization，拷贝初始化\n",[28,2786,2787,2789,2791,2793,2795,2797],{"class":30,"line":61},[28,2788,1068],{"class":34},[28,2790,2387],{"class":34},[28,2792,82],{"class":38},[28,2794,2392],{"class":34},[28,2796,2395],{"class":38},[28,2798,2799],{"class":95},"   \u002F\u002F direct-initialization，直接初始化\n",[14,2801,2802,2803,2805,2806,2809],{},"在当前 ",[25,2804,1068],{}," 示例中，它们都会调用普通的拷贝构造函数，因此效果相同。但面对带有 ",[25,2807,2808],{},"explicit"," 的转换构造函数时，两者会出现区别。",[14,2811,1978],{},[18,2813,2815],{"className":20,"code":2814,"language":22,"meta":23,"style":23},"class Number\n{\npublic:\n    explicit Number(int value)\n    {\n    }\n};\n",[25,2816,2817,2824,2828,2832,2849,2853,2857],{"__ignoreMap":23},[28,2818,2819,2821],{"class":30,"line":31},[28,2820,838],{"class":48},[28,2822,2823],{"class":34}," Number\n",[28,2825,2826],{"class":30,"line":61},[28,2827,64],{"class":38},[28,2829,2830],{"class":30,"line":67},[28,2831,870],{"class":48},[28,2833,2834,2837,2840,2842,2844,2846],{"class":30,"line":92},[28,2835,2836],{"class":48},"    explicit",[28,2838,2839],{"class":34}," Number",[28,2841,82],{"class":38},[28,2843,49],{"class":48},[28,2845,1921],{"class":888},[28,2847,2848],{"class":38},")\n",[28,2850,2851],{"class":30,"line":99},[28,2852,916],{"class":38},[28,2854,2855],{"class":30,"line":111},[28,2856,949],{"class":38},[28,2858,2859],{"class":30,"line":519},[28,2860,307],{"class":38},[14,2862,2863],{},"直接初始化可以显式调用这个构造函数：",[18,2865,2867],{"className":20,"code":2866,"language":22,"meta":23,"style":23},"Number n1(10);  \u002F\u002F 正确\n",[25,2868,2869],{"__ignoreMap":23},[28,2870,2871,2874,2877,2879,2882,2884],{"class":30,"line":31},[28,2872,2873],{"class":34},"Number",[28,2875,2876],{"class":34}," n1",[28,2878,82],{"class":38},[28,2880,2881],{"class":85},"10",[28,2883,2395],{"class":38},[28,2885,2886],{"class":95},"  \u002F\u002F 正确\n",[14,2888,2889,2890,2892],{},"拷贝初始化则不允许隐式使用 ",[25,2891,2808],{}," 构造函数：",[18,2894,2896],{"className":20,"code":2895,"language":22,"meta":23,"style":23},"Number n2 = 10;  \u002F\u002F 错误\n",[25,2897,2898],{"__ignoreMap":23},[28,2899,2900,2903,2905,2908,2910],{"class":30,"line":31},[28,2901,2902],{"class":38},"Number n2 ",[28,2904,227],{"class":48},[28,2906,2907],{"class":85}," 10",[28,2909,233],{"class":38},[28,2911,2912],{"class":95},"  \u002F\u002F 错误\n",[14,2914,2915],{},"因此，更准确的说法是：",[1641,2917,2918],{},[14,2919,2920,2921,1479,2923,2925],{},"对于本例中的同类型对象拷贝，",[25,2922,1478],{},[25,2924,1482],{}," 都调用拷贝构造函数；但“拷贝初始化”和“直接初始化”在所有场景下并不完全等价。",[1641,2927,2928],{},[14,2929,2930,2933,2934,2936,2937,1479,2940,2943,2944,143],{},[119,2931,2932],{},"补充："," 当前 ",[25,2935,1068],{}," 类手动管理动态内存，但只实现了析构函数、拷贝构造函数和移动构造函数。若还要安全支持 ",[25,2938,2939],{},"b = a",[25,2941,2942],{},"b = std::move(a)","，还应实现拷贝赋值运算符与移动赋值运算符，这通常称为 ",[119,2945,2946],{},"Rule of Five（五法则）",[441,2948,2950],{"id":2949},"示例-3在示例-2-基础上移动语义让函数返回大对象高效","示例 3：在示例 2 基础上，移动语义让函数返回大对象高效",[18,2952,2954],{"className":20,"code":2953,"language":22,"meta":23,"style":23},"#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",[25,2955,2956,2962,2968,2974,2978,2983,3008,3012,3025,3051,3055,3071,3075,3084,3088,3092,3100,3104,3123,3136,3147,3151,3168,3172,3188,3218,3222,3227,3235,3239,3244,3267,3292,3325,3358,3362,3370],{"__ignoreMap":23},[28,2957,2958,2960],{"class":30,"line":31},[28,2959,201],{"class":48},[28,2961,456],{"class":204},[28,2963,2964,2966],{"class":30,"line":61},[28,2965,201],{"class":48},[28,2967,463],{"class":204},[28,2969,2970,2972],{"class":30,"line":67},[28,2971,201],{"class":48},[28,2973,820],{"class":204},[28,2975,2976],{"class":30,"line":92},[28,2977,269],{"emptyLinePlaceholder":268},[28,2979,2980],{"class":30,"line":99},[28,2981,2982],{"class":95},"\u002F\u002F 返回大 vector（C++11 起自动启用移动语义，不需要手动 std::move）\n",[28,2984,2985,2987,2989,2991,2993,2995,2997,3000,3002,3004,3006],{"class":30,"line":111},[28,2986,35],{"class":34},[28,2988,39],{"class":38},[28,2990,42],{"class":34},[28,2992,45],{"class":38},[28,2994,49],{"class":48},[28,2996,52],{"class":38},[28,2998,2999],{"class":34},"make_data",[28,3001,82],{"class":38},[28,3003,49],{"class":48},[28,3005,889],{"class":888},[28,3007,2848],{"class":38},[28,3009,3010],{"class":30,"line":519},[28,3011,64],{"class":38},[28,3013,3014,3016,3018,3020,3022],{"class":30,"line":524},[28,3015,70],{"class":34},[28,3017,73],{"class":38},[28,3019,76],{"class":48},[28,3021,79],{"class":34},[28,3023,3024],{"class":38},"(n);\n",[28,3026,3027,3030,3032,3034,3036,3038,3040,3042,3044,3047,3049],{"class":30,"line":530},[28,3028,3029],{"class":48},"    for",[28,3031,1737],{"class":38},[28,3033,49],{"class":48},[28,3035,1742],{"class":38},[28,3037,227],{"class":48},[28,3039,767],{"class":85},[28,3041,1749],{"class":38},[28,3043,45],{"class":48},[28,3045,3046],{"class":38}," n; ",[28,3048,1757],{"class":48},[28,3050,1760],{"class":38},[28,3052,3053],{"class":30,"line":546},[28,3054,916],{"class":38},[28,3056,3057,3060,3062,3064,3067,3069],{"class":30,"line":569},[28,3058,3059],{"class":38},"        v[i] ",[28,3061,227],{"class":48},[28,3063,1742],{"class":38},[28,3065,3066],{"class":48},"*",[28,3068,2907],{"class":85},[28,3070,566],{"class":38},[28,3072,3073],{"class":30,"line":607},[28,3074,949],{"class":38},[28,3076,3077,3079,3081],{"class":30,"line":640},[28,3078,102],{"class":48},[28,3080,105],{"class":38},[28,3082,3083],{"class":95},"  \u002F\u002F ✅ 编译器自动移动（或 RVO 优化），不拷贝\n",[28,3085,3086],{"class":30,"line":645},[28,3087,114],{"class":38},[28,3089,3090],{"class":30,"line":651},[28,3091,269],{"emptyLinePlaceholder":268},[28,3093,3094,3096,3098],{"class":30,"line":674},[28,3095,49],{"class":48},[28,3097,474],{"class":34},[28,3099,58],{"class":38},[28,3101,3102],{"class":30,"line":692},[28,3103,64],{"class":38},[28,3105,3106,3109,3112,3114,3117,3119,3121],{"class":30,"line":724},[28,3107,3108],{"class":48},"    auto",[28,3110,3111],{"class":38}," data ",[28,3113,227],{"class":48},[28,3115,3116],{"class":34}," make_data",[28,3118,82],{"class":38},[28,3120,514],{"class":85},[28,3122,89],{"class":38},[28,3124,3125,3127,3129,3131,3134],{"class":30,"line":757},[28,3126,70],{"class":34},[28,3128,551],{"class":38},[28,3130,554],{"class":48},[28,3132,3133],{"class":204}," \"data: \"",[28,3135,566],{"class":38},[28,3137,3138,3140,3142,3144],{"class":30,"line":762},[28,3139,3029],{"class":48},[28,3141,1737],{"class":38},[28,3143,49],{"class":48},[28,3145,3146],{"class":38}," n : data)\n",[28,3148,3149],{"class":30,"line":772},[28,3150,916],{"class":38},[28,3152,3153,3155,3157,3159,3161,3163,3166],{"class":30,"line":1018},[28,3154,921],{"class":34},[28,3156,551],{"class":38},[28,3158,554],{"class":48},[28,3160,933],{"class":38},[28,3162,554],{"class":48},[28,3164,3165],{"class":204}," \" \"",[28,3167,566],{"class":38},[28,3169,3170],{"class":30,"line":1045},[28,3171,949],{"class":38},[28,3173,3174,3176,3178,3180,3182,3184,3186],{"class":30,"line":1050},[28,3175,70],{"class":34},[28,3177,551],{"class":38},[28,3179,554],{"class":48},[28,3181,595],{"class":204},[28,3183,560],{"class":85},[28,3185,563],{"class":204},[28,3187,566],{"class":38},[28,3189,3190,3192,3194,3196,3199,3201,3204,3206,3208,3210,3212,3214,3216],{"class":30,"line":1055},[28,3191,70],{"class":34},[28,3193,551],{"class":38},[28,3195,554],{"class":48},[28,3197,3198],{"class":204}," \"size = \"",[28,3200,581],{"class":48},[28,3202,3203],{"class":38}," data.",[28,3205,587],{"class":34},[28,3207,590],{"class":38},[28,3209,554],{"class":48},[28,3211,595],{"class":204},[28,3213,560],{"class":85},[28,3215,563],{"class":204},[28,3217,566],{"class":38},[28,3219,3220],{"class":30,"line":1061},[28,3221,269],{"emptyLinePlaceholder":268},[28,3223,3224],{"class":30,"line":1081},[28,3225,3226],{"class":95},"    \u002F\u002F ⚠️ 错误做法：不要对返回值用 std::move！\n",[28,3228,3229,3232],{"class":30,"line":1096},[28,3230,3231],{"class":95},"    \u002F\u002F auto data2 = std::move(make_data(5));",[28,3233,3234],{"class":95},"  \u002F\u002F ❌ 不要这样写！破坏 RVO 优化\n",[28,3236,3237],{"class":30,"line":1101},[28,3238,269],{"emptyLinePlaceholder":268},[28,3240,3241],{"class":30,"line":1117},[28,3242,3243],{"class":95},"    \u002F\u002F ✅ 正确做法：赋值给已有变量时用 = std::move(source)\n",[28,3245,3246,3248,3250,3252,3255,3257,3259,3261,3263,3265],{"class":30,"line":1129},[28,3247,70],{"class":34},[28,3249,73],{"class":38},[28,3251,76],{"class":48},[28,3253,3254],{"class":38}," old ",[28,3256,227],{"class":48},[28,3258,290],{"class":38},[28,3260,2601],{"class":85},[28,3262,296],{"class":38},[28,3264,2615],{"class":85},[28,3266,307],{"class":38},[28,3268,3269,3271,3273,3275,3278,3280,3282,3284,3286,3289],{"class":30,"line":1155},[28,3270,70],{"class":34},[28,3272,73],{"class":38},[28,3274,76],{"class":48},[28,3276,3277],{"class":38}," fresh ",[28,3279,227],{"class":48},[28,3281,323],{"class":34},[28,3283,39],{"class":38},[28,3285,328],{"class":34},[28,3287,3288],{"class":38},"(old);",[28,3290,3291],{"class":95},"  \u002F\u002F 把 old 的内容移给 fresh\n",[28,3293,3294,3296,3298,3300,3303,3305,3308,3310,3312,3314,3316,3318,3320,3322],{"class":30,"line":1160},[28,3295,70],{"class":34},[28,3297,551],{"class":38},[28,3299,554],{"class":48},[28,3301,3302],{"class":204}," \"old size = \"",[28,3304,581],{"class":48},[28,3306,3307],{"class":38}," old.",[28,3309,587],{"class":34},[28,3311,590],{"class":38},[28,3313,554],{"class":48},[28,3315,595],{"class":204},[28,3317,560],{"class":85},[28,3319,563],{"class":204},[28,3321,233],{"class":38},[28,3323,3324],{"class":95},"      \u002F\u002F 0\n",[28,3326,3327,3329,3331,3333,3336,3338,3341,3343,3345,3347,3349,3351,3353,3355],{"class":30,"line":1165},[28,3328,70],{"class":34},[28,3330,551],{"class":38},[28,3332,554],{"class":48},[28,3334,3335],{"class":204}," \"fresh size = \"",[28,3337,581],{"class":48},[28,3339,3340],{"class":38}," fresh.",[28,3342,587],{"class":34},[28,3344,590],{"class":38},[28,3346,554],{"class":48},[28,3348,595],{"class":204},[28,3350,560],{"class":85},[28,3352,563],{"class":204},[28,3354,233],{"class":38},[28,3356,3357],{"class":95},"  \u002F\u002F 2\n",[28,3359,3360],{"class":30,"line":1173},[28,3361,269],{"emptyLinePlaceholder":268},[28,3363,3364,3366,3368],{"class":30,"line":1178},[28,3365,102],{"class":48},[28,3367,767],{"class":85},[28,3369,566],{"class":38},[28,3371,3372],{"class":30,"line":1186},[28,3373,114],{"class":38},[14,3375,3376,780],{},[119,3377,779],{},[18,3379,3382],{"className":3380,"code":3381,"language":786},[784],"data: 0 10 20 30 40 \nsize = 5\nold size = 0\nfresh size = 2\n",[25,3383,3381],{"__ignoreMap":23},[10,3385,779],{"id":779},[14,3387,3388],{},"见上方每个示例的\"运行结果\"。",[10,3390,3391],{"id":3391},"示例中的关键语法解释",[340,3393,3394,3413],{},[343,3395,3396],{},[346,3397,3398,3401,3404,3407,3410],{},[349,3399,3400],{"align":351},"示例",[349,3402,3403],{"align":351},"讲了什么",[349,3405,3406],{"align":351},"新出现的语法",[349,3408,3409],{"align":351},"为什么这样写",[349,3411,3412],{"align":351},"注意事项",[360,3414,3415,3435,3459],{},[346,3416,3417,3420,3423,3429,3432],{},[365,3418,3419],{"align":351},"示例 1",[365,3421,3422],{"align":351},"拷贝 vs 移动对比",[365,3424,3425,3428],{"align":351},[25,3426,3427],{},"std::move()","、移动后 size=0",[365,3430,3431],{"align":351},"move 后源对象被\"掏空\"，变成有效但未指定状态",[365,3433,3434],{"align":351},"move 后不要再使用源对象（除非重新赋值）",[346,3436,3437,3440,3443,3453,3456],{},[365,3438,3439],{"align":351},"示例 2",[365,3441,3442],{"align":351},"自定义移动构造",[365,3444,3445,139,3448,139,3450],{"align":351},[25,3446,3447],{},"Buffer(Buffer&&)",[25,3449,1926],{},[25,3451,3452],{},"other.data=nullptr",[365,3454,3455],{"align":351},"移动构造直接偷指针，不分配新内存",[365,3457,3458],{"align":351},"移动后必须把 other.data 置 null，否则重复 delete",[346,3460,3461,3464,3467,3474,3477],{},[365,3462,3463],{"align":351},"示例 3",[365,3465,3466],{"align":351},"返回值和赋值优化",[365,3468,3469,3470,3473],{"align":351},"RVO、",[25,3471,3472],{},"return v"," 不加 move",[365,3475,3476],{"align":351},"编译器会优化返回值为移动\u002FRVO，加了 move 反而阻止 RVO",[365,3478,3479],{"align":351},"局部变量 return 时不要加 std::move",[10,3481,3483],{"id":3482},"为什么移动构造要写-noexcept","为什么移动构造要写 noexcept",[14,3485,3486,3489,3490,3492,3493,3495],{},[25,3487,3488],{},"std::vector"," 扩容时要把旧元素搬到新内存。如果元素类型的移动构造可能抛异常，",[25,3491,42],{}," 为了保证异常安全，可能宁愿走拷贝构造。也就是说：你明明写了移动构造，但如果没写 ",[25,3494,1926],{},"，容器扩容时不一定用它。",[18,3497,3499],{"className":20,"code":3498,"language":22,"meta":23,"style":23},"class Buffer\n{\npublic:\n    Buffer(Buffer&& other) noexcept\n    {\n        \u002F\u002F 偷资源，不抛异常\n    }\n};\n",[25,3500,3501,3507,3511,3515,3531,3535,3540,3544],{"__ignoreMap":23},[28,3502,3503,3505],{"class":30,"line":31},[28,3504,838],{"class":48},[28,3506,841],{"class":34},[28,3508,3509],{"class":30,"line":61},[28,3510,64],{"class":38},[28,3512,3513],{"class":30,"line":67},[28,3514,870],{"class":48},[28,3516,3517,3519,3521,3523,3525,3527,3529],{"class":30,"line":92},[28,3518,880],{"class":34},[28,3520,82],{"class":38},[28,3522,1068],{"class":34},[28,3524,246],{"class":48},[28,3526,976],{"class":888},[28,3528,1075],{"class":38},[28,3530,1078],{"class":48},[28,3532,3533],{"class":30,"line":99},[28,3534,916],{"class":38},[28,3536,3537],{"class":30,"line":111},[28,3538,3539],{"class":95},"        \u002F\u002F 偷资源，不抛异常\n",[28,3541,3542],{"class":30,"line":519},[28,3543,949],{"class":38},[28,3545,3546],{"class":30,"line":524},[28,3547,307],{"class":38},[14,3549,3550,3551,3554,3555,3558,3559,3561],{},"这个差异在单独移动一个对象时看不明显；当 ",[25,3552,3553],{},"vector\u003CBuffer>"," 大量 ",[25,3556,3557],{},"push_back"," 触发扩容时，是否 ",[25,3560,1926],{}," 才会影响容器选择移动还是拷贝。",[10,3563,3565],{"id":3564},"stdmove-什么时候该用什么时候不该用","std::move 什么时候该用，什么时候不该用",[340,3567,3568,3583],{},[343,3569,3570],{},[346,3571,3572,3575,3580],{},[349,3573,3574],{"align":351},"场景",[349,3576,3577,3578],{"align":351},"是否用 ",[25,3579,180],{},[349,3581,3582],{"align":351},"原因",[360,3584,3585,3596,3611,3624,3637],{},[346,3586,3587,3590,3593],{},[365,3588,3589],{"align":351},"把已有对象的资源转给另一个对象",[365,3591,3592],{"align":351},"✅",[365,3594,3595],{"align":351},"明确转移所有权或内容",[346,3597,3598,3604,3606],{},[365,3599,2215,3600,3603],{"align":351},[25,3601,3602],{},"unique_ptr"," 传给接收所有权的函数",[365,3605,3592],{"align":351},[365,3607,3608,3610],{"align":351},[25,3609,3602],{}," 不能拷贝，只能移动",[346,3612,3613,3618,3621],{},[365,3614,3615,3617],{"align":351},[25,3616,1229],{}," 局部变量",[365,3619,3620],{"align":351},"❌",[365,3622,3623],{"align":351},"让编译器做 RVO \u002F NRVO",[346,3625,3626,3632,3634],{},[365,3627,3628,3629,3631],{"align":351},"对 ",[25,3630,967],{}," 对象",[365,3633,3620],{"align":351},[365,3635,3636],{"align":351},"const 对象不能被真正移动，通常变成拷贝",[346,3638,3639,3642,3644],{},[365,3640,3641],{"align":351},"move 后还想继续读原对象内容",[365,3643,3620],{"align":351},[365,3645,3646],{"align":351},"moved-from 对象只保证可析构、可重新赋值",[10,3648,3649],{"id":3649},"常见错误",[14,3651,3652],{},[119,3653,3654],{},"错误 1：move 之后继续使用源对象",[18,3656,3658],{"className":20,"code":3657,"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];  \u002F\u002F ❌ a 已经被\"掏空\"，行为未定义\n",[25,3659,3660,3687,3709],{"__ignoreMap":23},[28,3661,3662,3664,3666,3668,3671,3673,3675,3677,3679,3681,3683,3685],{"class":30,"line":31},[28,3663,35],{"class":34},[28,3665,73],{"class":38},[28,3667,76],{"class":48},[28,3669,3670],{"class":38}," a ",[28,3672,227],{"class":48},[28,3674,290],{"class":38},[28,3676,293],{"class":85},[28,3678,296],{"class":38},[28,3680,299],{"class":85},[28,3682,296],{"class":38},[28,3684,304],{"class":85},[28,3686,307],{"class":38},[28,3688,3689,3691,3693,3695,3698,3700,3702,3704,3706],{"class":30,"line":61},[28,3690,35],{"class":34},[28,3692,73],{"class":38},[28,3694,76],{"class":48},[28,3696,3697],{"class":38}," b ",[28,3699,227],{"class":48},[28,3701,323],{"class":34},[28,3703,39],{"class":38},[28,3705,328],{"class":34},[28,3707,3708],{"class":38},"(a);\n",[28,3710,3711,3713,3715,3717,3720,3722,3725],{"class":30,"line":67},[28,3712,35],{"class":34},[28,3714,551],{"class":38},[28,3716,554],{"class":48},[28,3718,3719],{"class":38}," a[",[28,3721,1676],{"class":85},[28,3723,3724],{"class":38},"];",[28,3726,3727],{"class":95},"  \u002F\u002F ❌ a 已经被\"掏空\"，行为未定义\n",[14,3729,3730],{},"正确做法：move 后不要再使用源对象，或者先检查是否为空。",[14,3732,3733],{},[119,3734,3735],{},"错误 2：对 const 对象用 move",[18,3737,3739],{"className":20,"code":3738,"language":22,"meta":23,"style":23},"const std::vector\u003Cint> a = {1, 2, 3};\nstd::vector\u003Cint> b = std::move(a);  \u002F\u002F ❌ 实际执行的是拷贝！const 对象不能移动\n",[25,3740,3741,3769],{"__ignoreMap":23},[28,3742,3743,3745,3747,3749,3751,3753,3755,3757,3759,3761,3763,3765,3767],{"class":30,"line":31},[28,3744,967],{"class":48},[28,3746,323],{"class":34},[28,3748,73],{"class":38},[28,3750,76],{"class":48},[28,3752,3670],{"class":38},[28,3754,227],{"class":48},[28,3756,290],{"class":38},[28,3758,293],{"class":85},[28,3760,296],{"class":38},[28,3762,299],{"class":85},[28,3764,296],{"class":38},[28,3766,304],{"class":85},[28,3768,307],{"class":38},[28,3770,3771,3773,3775,3777,3779,3781,3783,3785,3787,3789],{"class":30,"line":61},[28,3772,35],{"class":34},[28,3774,73],{"class":38},[28,3776,76],{"class":48},[28,3778,3697],{"class":38},[28,3780,227],{"class":48},[28,3782,323],{"class":34},[28,3784,39],{"class":38},[28,3786,328],{"class":34},[28,3788,2557],{"class":38},[28,3790,3791],{"class":95},"  \u002F\u002F ❌ 实际执行的是拷贝！const 对象不能移动\n",[14,3793,3794],{},"正确做法：move 不要用于 const 对象。",[14,3796,3797],{},[119,3798,3799],{},"错误 3：给返回值加 std::move",[18,3801,3803],{"className":20,"code":3802,"language":22,"meta":23,"style":23},"std::vector\u003Cint> func()\n{\n    std::vector\u003Cint> v(1000);\n    return std::move(v);  \u002F\u002F ❌ 阻止了 RVO 优化！\n}\n",[25,3804,3805,3824,3828,3844,3860],{"__ignoreMap":23},[28,3806,3807,3809,3811,3813,3815,3817,3819,3822],{"class":30,"line":31},[28,3808,35],{"class":34},[28,3810,39],{"class":38},[28,3812,42],{"class":34},[28,3814,45],{"class":38},[28,3816,49],{"class":48},[28,3818,52],{"class":38},[28,3820,3821],{"class":34},"func",[28,3823,58],{"class":38},[28,3825,3826],{"class":30,"line":61},[28,3827,64],{"class":38},[28,3829,3830,3832,3834,3836,3838,3840,3842],{"class":30,"line":67},[28,3831,70],{"class":34},[28,3833,73],{"class":38},[28,3835,76],{"class":48},[28,3837,79],{"class":34},[28,3839,82],{"class":38},[28,3841,1270],{"class":85},[28,3843,89],{"class":38},[28,3845,3846,3848,3850,3852,3854,3857],{"class":30,"line":92},[28,3847,102],{"class":48},[28,3849,323],{"class":34},[28,3851,39],{"class":38},[28,3853,328],{"class":34},[28,3855,3856],{"class":38},"(v);",[28,3858,3859],{"class":95},"  \u002F\u002F ❌ 阻止了 RVO 优化！\n",[28,3861,3862],{"class":30,"line":99},[28,3863,114],{"class":38},[14,3865,3866,3867,3870],{},"正确做法：直接 ",[25,3868,3869],{},"return v;","，编译器会自动优化。",[14,3872,3873],{},[119,3874,3875],{},"错误 4：移动构造函数没有标记 noexcept",[18,3877,3879],{"className":20,"code":3878,"language":22,"meta":23,"style":23},"MyClass(MyClass&& other) { ... }  \u002F\u002F 缺少 noexcept\n",[25,3880,3881],{"__ignoreMap":23},[28,3882,3883,3886,3889,3891,3894],{"class":30,"line":31},[28,3884,3885],{"class":34},"MyClass",[28,3887,3888],{"class":38},"(MyClass",[28,3890,246],{"class":48},[28,3892,3893],{"class":38}," other) { ... }",[28,3895,3896],{"class":95},"  \u002F\u002F 缺少 noexcept\n",[14,3898,3899,3900,3903],{},"正确做法：",[25,3901,3902],{},"MyClass(MyClass&& other) noexcept { ... }"," — 不标记 noexcept 会导致 vector 等容器在扩容时退化为拷贝。",[10,3905,3906],{"id":3906},"使用建议",[1461,3908,3909,3915,3928,3934,3942],{},[130,3910,3911,3914],{},[119,3912,3913],{},"return 时不要加 std::move","：让编译器自动优化（RVO\u002FNRVO）。",[130,3916,3917,3923,3924,3927],{},[119,3918,3919,3920],{},"赋值给已有对象时用 ",[25,3921,3922],{},"std::move(source)","：用 ",[25,3925,3926],{},"target = std::move(source)"," 避免拷贝。",[130,3929,3930,3933],{},[119,3931,3932],{},"move 后不要再用源对象","（除非重新赋值或重置）。",[130,3935,3936,3941],{},[119,3937,3938,3939],{},"移动构造函数必须标记 ",[25,3940,1926],{},"：否则 STL 容器在扩容时不会调用它。",[130,3943,3944,3949],{},[119,3945,3946,3948],{},[25,3947,180],{}," 不移动任何东西","：它只是类型转换，把左值变成右值引用。真正的移动发生在移动构造函数或移动赋值运算符中。",[10,3951,3952],{"id":3952},"小结",[127,3954,3955,3958,3963,3966,3971,3974],{},[130,3956,3957],{},"左值有名字、可取地址；右值是临时的（字面量、临时对象）。",[130,3959,163,3960,3962],{},[25,3961,166],{}," 绑定到右值。",[130,3964,3965],{},"移动语义\"偷\"右值的资源，避免深拷贝。",[130,3967,3968,3970],{},[25,3969,158],{}," 把左值转为右值，告诉编译器\"x 可以被偷\"。",[130,3972,3973],{},"return 局部变量时不要加 std::move（让编译器自己优化）。",[130,3975,3938,3976,143],{},[25,3977,1926],{},[441,3979,3980],{"id":3980},"工程拓展",[14,3982,3983],{},"在 ROS2 中，发布消息、传输大量传感器数据（如点云、图像）时，移动语义能避免大数据拷贝。在 Boost.Asio 中，异步操作的回调参数大量使用移动语义来高效传递数据缓冲区。",[3985,3986,3987],"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":3989},[3990,3991,3992,3993,3994,3995,3996,4001,4002,4003,4004,4005,4006,4007],{"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":3997},[3998,3999,4000],{"id":443,"depth":67,"text":444},{"id":791,"depth":67,"text":792},{"id":2949,"depth":67,"text":2950},{"id":779,"depth":61,"text":779},{"id":3391,"depth":61,"text":3391},{"id":3482,"depth":61,"text":3483},{"id":3564,"depth":61,"text":3565},{"id":3649,"depth":61,"text":3649},{"id":3906,"depth":61,"text":3906},{"id":3952,"depth":61,"text":3952,"children":4008},[4009],{"id":3980,"depth":67,"text":3980},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi","2000-1000","2023-10-05","wiki\u002F2023-10-05-cplusplus-jiao-xue","zh-cn:2023-10-05-cplusplus-jiao-xue","\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue","Cplusplus教学","md","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1000-右值引用和移动语义",false,null,"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi","zh-CN","zh-cn",{},{"title":5,"description":23},"M-SqoawTUGn4dpl0NMDSrEvS2ghx86qQRkW_bgwOgPo",[4028,4034,4039,4044,4049,4054,4059,4064,4069,4074,4078,4083,4088,4093,4098,4103,4108,4113,4118,4123,4128,4133,4138,4143,4148,4153,4158,4163,4168,4173,4178,4183,4188,4193,4198,4203,4208,4213,4218,4222,4227,4232,4237,4242,4247,4252,4257,4258,4263,4268,4273,4278,4283,4288,4293,4298,4303,4308,4313,4318,4323,4328,4333,4338,4343,4348,4353,4358,4363,4368,4373,4378,4383,4388,4393,4398,4403,4408,4413,4418,4423,4428],{"path":4029,"stem":4030,"title":4031,"date":4012,"chapterOrder":4032,"chapterDepth":4033,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\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++开发环境搭建与测试","0100",0,{"path":4035,"stem":4036,"title":4037,"date":4012,"chapterOrder":4038,"chapterDepth":4033,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0200-c-ji-chu-chu-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F0200-C++基础初识","C++基础初识","0200",{"path":4040,"stem":4041,"title":4042,"date":4012,"chapterOrder":4043,"chapterDepth":4033,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0300-shu-ju-lei-xing-yu-shu-ju-cun-fang","wiki\u002F2023-10-05-Cplusplus教学\u002F0300-数据类型与数据存放","数据类型与数据存放","0300",{"path":4045,"stem":4046,"title":4047,"date":4012,"chapterOrder":4048,"chapterDepth":4033,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0400-shu-ru-shu-chu","wiki\u002F2023-10-05-Cplusplus教学\u002F0400-输入输出","输入输出","0400",{"path":4050,"stem":4051,"title":4052,"date":4012,"chapterOrder":4053,"chapterDepth":4033,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0500-yun-suan-fu","wiki\u002F2023-10-05-Cplusplus教学\u002F0500-运算符","运算符","0500",{"path":4055,"stem":4056,"title":4057,"date":4012,"chapterOrder":4058,"chapterDepth":4033,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0600-cheng-xu-liu-cheng-jie-gou","wiki\u002F2023-10-05-Cplusplus教学\u002F0600-程序流程结构","程序流程结构","0600",{"path":4060,"stem":4061,"title":4062,"date":4012,"chapterOrder":4063,"chapterDepth":4033,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0700-shu-zu","wiki\u002F2023-10-05-Cplusplus教学\u002F0700-数组","数组","0700",{"path":4065,"stem":4066,"title":4067,"date":4012,"chapterOrder":4068,"chapterDepth":4033,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0800-han-shu-yu-tou-wen-jian","wiki\u002F2023-10-05-Cplusplus教学\u002F0800-函数与头文件","函数与头文件","0800",{"path":4070,"stem":4071,"title":4072,"date":4012,"chapterOrder":4073,"chapterDepth":4033,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0900-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F0900-指针","指针","0900",{"path":4075,"stem":4076,"title":4077,"date":4012,"chapterOrder":1270,"chapterDepth":4033,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1000-jie-gou-ti-yu-gong-yong-ti","wiki\u002F2023-10-05-Cplusplus教学\u002F1000-结构体与共用体","结构体与共用体",{"path":4079,"stem":4080,"title":4081,"date":4012,"chapterOrder":4082,"chapterDepth":4033,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1100-nei-cun-fen-qu-yu-sheng-ming-zhou-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1100-内存分区与生命周期","内存分区与生命周期","1100",{"path":4084,"stem":4085,"title":4086,"date":4012,"chapterOrder":4087,"chapterDepth":4033,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1200-yin-yong","wiki\u002F2023-10-05-Cplusplus教学\u002F1200-引用","引用","1200",{"path":4089,"stem":4090,"title":4091,"date":4012,"chapterOrder":4092,"chapterDepth":4033,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1300-han-shu-ti-gao-yu-ming-ming-kong-jian","wiki\u002F2023-10-05-Cplusplus教学\u002F1300-函数提高与命名空间","函数提高与命名空间","1300",{"path":4094,"stem":4095,"title":4096,"date":4012,"chapterOrder":4097,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0100-feng-zhuang","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0100-封装","封装","1400-0100",{"path":4099,"stem":4100,"title":4101,"date":4012,"chapterOrder":4102,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0200-dui-xiang-chu-shi-hua-he-qing-li","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0200-对象初始化和清理","对象初始化和清理","1400-0200",{"path":4104,"stem":4105,"title":4106,"date":4012,"chapterOrder":4107,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\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指针","1400-0300",{"path":4109,"stem":4110,"title":4111,"date":4012,"chapterOrder":4112,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0400-you-yuan-yu-yun-suan-fu-zhong-zai","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0400-友元与运算符重载","友元与运算符重载","1400-0400",{"path":4114,"stem":4115,"title":4116,"date":4012,"chapterOrder":4117,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0500-ji-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0500-继承","继承","1400-0500",{"path":4119,"stem":4120,"title":4121,"date":4012,"chapterOrder":4122,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0600-duo-tai","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0600-多态","多态","1400-0600",{"path":4124,"stem":4125,"title":4126,"date":4012,"chapterOrder":4127,"chapterDepth":4033,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-lei-he-dui-xiang","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-类和对象","类和对象","1400",{"path":4129,"stem":4130,"title":4131,"date":4012,"chapterOrder":4132,"chapterDepth":4033,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1500-wen-jian-cao-zuo","wiki\u002F2023-10-05-Cplusplus教学\u002F1500-文件操作","文件操作","1500",{"path":4134,"stem":4135,"title":4136,"date":4012,"chapterOrder":4137,"chapterDepth":4033,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1600-yi-chang-chu-li-yu-cuo-wu-ma","wiki\u002F2023-10-05-Cplusplus教学\u002F1600-异常处理与错误码","异常处理","1600",{"path":4139,"stem":4140,"title":4141,"date":4012,"chapterOrder":4142,"chapterDepth":4033,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1700-mu-ban","wiki\u002F2023-10-05-Cplusplus教学\u002F1700-模板","模板","1700",{"path":4144,"stem":4145,"title":4146,"date":4012,"chapterOrder":4147,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0100-stl-chu-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0100-STL初识","STL初识","1800-0100",{"path":4149,"stem":4150,"title":4151,"date":4012,"chapterOrder":4152,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0200-std-array","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0200-std-array","std::array","1800-0200",{"path":4154,"stem":4155,"title":4156,"date":4012,"chapterOrder":4157,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0300-string-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0300-string容器","string容器","1800-0300",{"path":4159,"stem":4160,"title":4161,"date":4012,"chapterOrder":4162,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0400-vector-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0400-vector容器","vector 容器","1800-0400",{"path":4164,"stem":4165,"title":4166,"date":4012,"chapterOrder":4167,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0500-deque-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0500-deque容器","deque 容器","1800-0500",{"path":4169,"stem":4170,"title":4171,"date":4012,"chapterOrder":4172,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0600-stack-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0600-stack容器","stack 容器","1800-0600",{"path":4174,"stem":4175,"title":4176,"date":4012,"chapterOrder":4177,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0700-queue-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0700-queue容器","queue 容器","1800-0700",{"path":4179,"stem":4180,"title":4181,"date":4012,"chapterOrder":4182,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0800-list-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0800-list容器","list 容器","1800-0800",{"path":4184,"stem":4185,"title":4186,"date":4012,"chapterOrder":4187,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0900-set-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0900-set容器","set \u002F multiset 容器","1800-0900",{"path":4189,"stem":4190,"title":4191,"date":4012,"chapterOrder":4192,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1000-map-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-1000-map容器","map \u002F multimap 容器","1800-1000",{"path":4194,"stem":4195,"title":4196,"date":4012,"chapterOrder":4197,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1100-han-shu-dui-xiang-yu-wei-ci","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-1100-函数对象与谓词","函数对象与谓词","1800-1100",{"path":4199,"stem":4200,"title":4201,"date":4012,"chapterOrder":4202,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1200-chang-yong-suan-fa","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-1200-常用算法","常用算法","1800-1200",{"path":4204,"stem":4205,"title":4206,"date":4012,"chapterOrder":4207,"chapterDepth":4033,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-stl-ti-gao-bian-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-STL提高编程","STL提高编程","1800",{"path":4209,"stem":4210,"title":4211,"date":4012,"chapterOrder":4212,"chapterDepth":4033,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1900-c-lei-xing-zhuan-huan","wiki\u002F2023-10-05-Cplusplus教学\u002F1900-C++类型转换","C++类型转换","1900",{"path":4214,"stem":4215,"title":4216,"date":4012,"chapterOrder":4217,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0100-auto","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0100-auto","auto","2000-0100",{"path":4219,"stem":4220,"title":2314,"date":4012,"chapterOrder":4221,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0200-nullptr","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0200-nullptr","2000-0200",{"path":4223,"stem":4224,"title":4225,"date":4012,"chapterOrder":4226,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0300-using","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0300-using","using","2000-0300",{"path":4228,"stem":4229,"title":4230,"date":4012,"chapterOrder":4231,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0400-enum-class","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0400-enum-class","enum class","2000-0400",{"path":4233,"stem":4234,"title":4235,"date":4012,"chapterOrder":4236,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0500-fan-wei-for-xun-huan","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0500-范围for循环","范围 for 循环","2000-0500",{"path":4238,"stem":4239,"title":4240,"date":4012,"chapterOrder":4241,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0600-jie-gou-hua-bang-ding","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0600-结构化绑定","结构化绑定","2000-0600",{"path":4243,"stem":4244,"title":4245,"date":4012,"chapterOrder":4246,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0700-constexpr","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0700-constexpr","constexpr","2000-0700",{"path":4248,"stem":4249,"title":4250,"date":4012,"chapterOrder":4251,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0800-RAII","RAII","2000-0800",{"path":4253,"stem":4254,"title":4255,"date":4012,"chapterOrder":4256,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0900-智能指针","智能指针","2000-0900",{"path":4010,"stem":4018,"title":5,"date":4012,"chapterOrder":4011,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},{"path":4259,"stem":4260,"title":4261,"date":4012,"chapterOrder":4262,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1100-lambda-biao-da-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1100-Lambda表达式","Lambda 表达式","2000-1100",{"path":4264,"stem":4265,"title":4266,"date":4012,"chapterOrder":4267,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1200-std-function","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1200-std-function","std::function","2000-1200",{"path":4269,"stem":4270,"title":4271,"date":4012,"chapterOrder":4272,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1300-std-bind","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1300-std-bind","std::bind","2000-1300",{"path":4274,"stem":4275,"title":4276,"date":4012,"chapterOrder":4277,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1400-std-optional","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1400-std-optional","std::optional","2000-1400",{"path":4279,"stem":4280,"title":4281,"date":4012,"chapterOrder":4282,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1500-std-variant","std::variant","2000-1500",{"path":4284,"stem":4285,"title":4286,"date":4012,"chapterOrder":4287,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1600-std-span","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1600-std-span","std::span","2000-1600",{"path":4289,"stem":4290,"title":4291,"date":4012,"chapterOrder":4292,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\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","2000-1700",{"path":4294,"stem":4295,"title":4296,"date":4012,"chapterOrder":4297,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1800-std-chrono","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1800-std-chrono","std::chrono","2000-1800",{"path":4299,"stem":4300,"title":4301,"date":4012,"chapterOrder":4302,"chapterDepth":61,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0100-std-thread","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0100-std-thread","std::thread 与 join","2000-1900-0100",{"path":4304,"stem":4305,"title":4306,"date":4012,"chapterOrder":4307,"chapterDepth":61,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0200-mutex-lock-guard","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0200-mutex-lock-guard","mutex 与 lock_guard","2000-1900-0200",{"path":4309,"stem":4310,"title":4311,"date":4012,"chapterOrder":4312,"chapterDepth":61,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0300-std-atomic","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0300-std-atomic","std::atomic","2000-1900-0300",{"path":4314,"stem":4315,"title":4316,"date":4012,"chapterOrder":4317,"chapterDepth":61,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0400-condition-variable","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0400-condition-variable","condition_variable","2000-1900-0400",{"path":4319,"stem":4320,"title":4321,"date":4012,"chapterOrder":4322,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-bing-fa-bian-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-并发编程","并发编程","2000-1900",{"path":4324,"stem":4325,"title":4326,"date":4012,"chapterOrder":4327,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2000-std-filesystem","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-2000-std-filesystem","std::filesystem","2000-2000",{"path":4329,"stem":4330,"title":4331,"date":4012,"chapterOrder":4332,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2100-modules-jian-jie","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-2100-modules简介","modules 简介","2000-2100",{"path":4334,"stem":4335,"title":4336,"date":4012,"chapterOrder":4337,"chapterDepth":4033,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-xian-dai-c","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-现代C++","现代C++","2000",{"path":4339,"stem":4340,"title":4341,"date":4012,"chapterOrder":4342,"chapterDepth":61,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\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","2100-0100-0100",{"path":4344,"stem":4345,"title":4346,"date":4012,"chapterOrder":4347,"chapterDepth":61,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\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 基础","2100-0100-0200",{"path":4349,"stem":4350,"title":4351,"date":4012,"chapterOrder":4352,"chapterDepth":61,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0300-chuan-kou-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0300-串口通信","串口通信","2100-0100-0300",{"path":4354,"stem":4355,"title":4356,"date":4012,"chapterOrder":4357,"chapterDepth":61,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0400-TCP通信","TCP 通信","2100-0100-0400",{"path":4359,"stem":4360,"title":4361,"date":4012,"chapterOrder":4362,"chapterDepth":61,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0500-udp-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0500-UDP通信","UDP 通信","2100-0100-0500",{"path":4364,"stem":4365,"title":4366,"date":4012,"chapterOrder":4367,"chapterDepth":61,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\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 集成","2100-0100-0600",{"path":4369,"stem":4370,"title":4371,"date":4012,"chapterOrder":4372,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\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库","2100-0100",{"path":4374,"stem":4375,"title":4376,"date":4012,"chapterOrder":4377,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0200-eigen-xian-xing-dai-shu-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0200-Eigen线性代数库","Eigen线性代数库","2100-0200",{"path":4379,"stem":4380,"title":4381,"date":4012,"chapterOrder":4382,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\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计算机视觉库","2100-0300",{"path":4384,"stem":4385,"title":4386,"date":4012,"chapterOrder":4387,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0400-pcl-dian-yun-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0400-PCL点云库","PCL点云库","2100-0400",{"path":4389,"stem":4390,"title":4391,"date":4012,"chapterOrder":4392,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\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 李群李代数库","2100-0500",{"path":4394,"stem":4395,"title":4396,"date":4012,"chapterOrder":4397,"chapterDepth":4033,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-chang-yong-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-常用库","常用库学习","2100",{"path":4399,"stem":4400,"title":4401,"date":4012,"chapterOrder":4402,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0100-cmakepresets-yu-gou-jian-an-zhuang","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0100-CMakePresets与构建安装","CMakePresets与构建安装","2200-0100",{"path":4404,"stem":4405,"title":4406,"date":4012,"chapterOrder":4407,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\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与公共编译选项","2200-0200",{"path":4409,"stem":4410,"title":4411,"date":4012,"chapterOrder":4412,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\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详解","2200-0300",{"path":4414,"stem":4415,"title":4416,"date":4012,"chapterOrder":4417,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0400-di-san-fang-ku-yi-lai-xie-fa","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0400-第三方库依赖写法","第三方库依赖写法","2200-0400",{"path":4419,"stem":4420,"title":4421,"date":4012,"chapterOrder":4422,"chapterDepth":31,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\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-模板扩展与常见问题","模板扩展与常见问题","2200-0500",{"path":4424,"stem":4425,"title":4426,"date":4012,"chapterOrder":4427,"chapterDepth":4033,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":4019},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-cmake-gong-cheng-mu-ban","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-CMake工程模板","CMake工程模板","2200",{"path":4015,"stem":4429,"title":4430,"date":4012,"chapterOrder":4020,"chapterDepth":4033,"docKey":4014,"docRoot":4015,"docTitle":4016,"isWikiDoc":268,"isWikiIndex":268},"wiki\u002F2023-10-05-Cplusplus教学\u002Findex","C\u002FC++教程",{"variants":4432},[4433,4436,4439,4442,4445],{"path":4434,"localeSlug":4435,"i18nKey":4018},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi","en-us",{"path":4437,"localeSlug":4438,"i18nKey":4018},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi","zh-hant",{"path":4440,"localeSlug":4441,"i18nKey":4018},"\u002Fzh-hk\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi","zh-hk",{"path":4443,"localeSlug":4444,"i18nKey":4018},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi","zh-tw",{"path":4010,"localeSlug":4023,"i18nKey":4018},[4434,4021,4437,4021,4440,4021,4443,4021,4010,4021],1784646786768]