c 函式的右值 臨時變數返回值會先拷貝後銷毀嗎

時間 2021-05-30 00:12:08

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 有些時候乙個返回不夠用啊,函式中好幾個值需要傳出時只能通過引數傳遞實現,而不能簡單的通過函式返回值。當然,你也可以設計乙個資料...