[英]Why should I ever return something by value, since C++ features const references?
考慮這個功能:
Thing func(){
return something;
}
每次調用此函數時,都會創建一個something
副本並傳遞給調用者。
我的問題是,為什么不這樣做( 每次我想按價值歸還)?
const Thing& func(){
return something;
}
這樣,我們就沒有冒險在沒有理由的情況下復制something
。 如果客戶端只需要“讀取” something
,而不是“寫入”它,那么const引用就可以完全實現。 如果客戶端確實需要副本,它可以簡單地將const引用分配給變量,例如:
Thing thing = func(); // the object is passed by const reference, and then copied.
那么,有沒有理由簡單地按價值回報?
順便說一句,並不是因為我非常關心優化,只是因為我沒有理由單純地通過價值來回報。
跟進問題:閱讀答案,我知道每種方法都有利弊。 有違約嗎? 例如“默認按值返回” ? 或者它純粹基於具體案例?
因為如果您的對象(無論出於何種原因)是在被調用函數的堆棧上創建的,則返回並使用對它的引用是未定義的行為。
通過返回值,編譯器有時可以優化返回,並且沒有危險的懸空引用。 使用C ++ 11和移動語義,這將達到一個新的水平。
說“通過引用而不是通過值返回總是更好”是不合理的,每個使用一個的情況都必須單獨考慮。
那么,有沒有理由簡單地按價值回報?
是。 例如,如果要返回函數局部變量。
int compute(int a, int b)
{
int result;
// a lot of magic
return result;
}
如果該函數要返回對任何類型result
的引用,那么它將是一個懸空的。
除此之外,可以使用copy elision優化返回具有“按值”類類型的函數局部變量 - 優化的名稱是NRVO。 如果該優化不適用,新引入的移動語義可能(盡管你應該只依賴於復制省略,它的效果非常好)。 在這種情況下,沒有動機返回參考。
此外,如果您希望保密,則不希望返回引用。 為什么要在公共成員函數中返回const引用到私有成員變量? 它表示成員變量存在 ,呼叫站點不必知道的信息。 還要考慮線程安全性:如果在return
陳述之后另一個線程正在修改同一個對象,則通過引用返回變量可能會導致數據爭用。
或者它純粹基於具體案例?
大多數情況下,您將按值返回,特別是對於非成員函數。 成員函數可能會返回對成員*的引用,但幾乎沒有非成員函數返回引用的情況。 只有當您知道自己需要(以及您正在做什么)時,才應該返回引用。
* 而且只有他們真的需要 。
如果要返回非靜態局部變量,則必須按值返回,因為它將在函數返回時被銷毀,從而使對它的任何引用無效。 在這種情況下,副本通常可以由移動替換,或者完全省略。
如果你要回歸一些東西,那么你是對的; 返回引用通常更好,讓調用者決定是否應該復制它。 但是可能還有其他原因,比如線程安全,更喜歡按值返回,即使這樣:通過返回副本,讀者無法訪問持久對象,而另一個線程可能正在修改它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.