1樓:穀雨同學
一般情況下都不需要(而且不建議)手動在返回值處 std::move。
這是因為,C++ 17 強制要求返回值優化(簡稱 RVO),而大部分編譯器會實現具名返回值優化(簡稱 NRVO)。
返回值優化是指,如果 return 的值是乙個純右值時候,會進行複製消除:Tf
();// 必須優化:直接構造而非「構造->複製構造」
}具名返回值優化是指,如果 return 的是乙個非 volatile 的「區域性」物件名字,則不呼叫複製構造。(以我的理解,這裡出現了名字說明它是乙個左值。)Tf
();foo(a);
returna;
// 容許優化
}但如果返回值是 std::move(a), 它既不是左值(因為不是乙個名字),也不是純右值(std::move(...
) 的結果是亡值)。所以這樣反而避免了任何優化的可能。Tf
();foo(a);
return
std::
move(a
);// 既不能 NRVO,也不能 RVO,無法優化!
}所以在一般情況下不要在返回值處寫 std::move。
更嚴重的問題是返回右值引用型別:T&&
f()這顯然是更加錯誤的:它會導致懸垂引用,就類似於T&
f();returna;
}這樣的錯誤,只不過是右值版本的。在返回引用前請務必思考清楚,這個引用所繫結到的東西是不是區域性的?如果是,那麼肯定出問題了。
所以總結下來:一般在返回值處使用 std::move 反而喪失優化機會,而返回值型別為 T&& 則更嚴重地會導致未定義行為。
C 的函式返回值是如何構造的?
你如果是想問為什麼少輸出乙個new的話,那是因為F在隱式建立返回值物件的過程中,呼叫的是複製建構函式A const A 而不是預設的無參建構函式A 所以你自定義的無參建構函式A 並沒有捕獲到這次構造。include using namespace std struct A A A const A o...
JS 建構函式返回值的問題
如果return的值是object,那麼就返回這個return的object,前面的this就都是無效的 如果return的值型別不是object,就還是返回this 搬運一下Annotated ES5 11.2.2 The new Operator The production NewExpres...
為什麼不把要返回元素直接當成函式的返回值返回呢?
phoenix bool get elem elem get throw elem get bool 回字的四種寫法 iter get tuple get 想到再加 ant 有些時候乙個返回不夠用啊,函式中好幾個值需要傳出時只能通過引數傳遞實現,而不能簡單的通過函式返回值。當然,你也可以設計乙個資料...