簡體   English   中英

為什么我應該按值返回一些東西,因為C ++具有const引用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM