在 C++11 及以上標準中,函數返回局部對象時直接返回即可,無需顯式使用 std::move。編譯器會自動應用返回值優化(RVO/NRVO)或移動構造函數,效率最高且代碼最簡潔。
當函數按值返回局部變量時,該變量在返回語句中被視為右值。編譯器優先嘗試 NRVO(命名返回值優化),直接在調用者的棧框構造對象,零拷貝零移動。若 NRVO 不可行,編譯器會隱式調用移動構造函數(前提是類型支援移動語義)。顯式寫 return std::move(obj) 反而會抑制 NRVO,導致性能下降。
T&&),用於實現移動語義// 最佳實踐:直接返回 std::vectorreturn_vector() { std::vector tmp {1,2,3,4,5}; return tmp; // NRVO 或移動構造,零開銷 } // 錯誤示範:返回局部對象的右值引用 → 懸空引用 std::vector && return_vector_bad() { std::vector tmp {1,2,3,4,5}; return std::move(tmp); // 返回已銷毀對象的引用,未定義行為 } // 多餘的 std::move:抑制 NRVO std::vector return_vector_pessimized() { std::vector tmp {1,2,3,4,5}; return std::move(tmp); // 強制移動構造,失去 NRVO 機會 }
return obj;const 類型(阻礙移動)std::move現代編譯器(GCC、Clang、MSVC)在啟用 C++11 選項(-std=c++11 或 /std:c++14)後均完美支援上述優化。無需手動干預,信任編譯器即可。