簡體   English   中英

將函數的返回值賦給參考c ++?

[英]Assign return value from function to a reference c++?

這是一個兩部分問題。 可以將函數的返回值賦給引用嗎?

Foo FuncBar()
{
    return Foo();
}

// some where else
Foo &myFoo = FuncBar();

這個可以嗎? 我的理解是FuncBar()返回一個Foo對象,現在myFoomyFoo的引用。

問題的第二部分。 這是優化嗎? 因此,如果你在一個循環中這樣做很多時候做得更好

Foo &myFoo = FuncBar();

要么

Foo myFoo = FuncBar();

並且考慮到變量的使用,不會使用ref需要更慢的解引用?

Foo &myFoo = FuncBar();

不會編譯。 它應該是:

const Foo &myFoo = FuncBar();

因為FuncBar()返回一個臨時對象(即rvalue),只有lvalues可以綁定到對非const的引用。

安全嗎?

是的,這是安全的。

C ++標准規定將臨時對象綁定到const的引用會延長臨時對象到引用本身生命周期的生命周期,從而避免了常見的懸空引用錯誤。


Foo myFoo = FuncBar();      

復制初始化
它創建FuncBar()返回的對象的副本,然后使用該副本myFoo 執行語句后, myFoo是一個單獨的對象。

const Foo &myFoo = FuncBar();

FuncBar()返回的臨時值綁定到引用myFoo ,請注意myFoo只是返回的臨時對象的別名而不是單獨的對象。

您沒有“分配”到引用,而是綁定到引用。

當類型為const且上下文是臨時的自動生命周期擴展時,這是唯一正確的。

通常,當Foo不是const類型時,您的示例應該無法編譯。 不幸的是,由於該編譯器實現了語言擴展,它們可以使用一個通用編譯器進行編譯。 使用至少兩個編譯器嘗試示例(以及普通代碼!)是個好主意。


編輯:作為發布問題之前的調查工作的一個例子,您應該編寫以下(或非常相似)具有最高警告級別的至少兩個編譯器,定義和不定義CONST

struct Bar {};

#ifdef CONST
    typedef Bar const Foo;
#else
    typedef Bar Foo;
#endif

Foo FuncBar()
{
    return Foo();
}

int main()
{
    // som where else
    Foo &myFoo = FuncBar();
}

如果您還沒有這樣做,那么現在就這樣做是個好主意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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