[英]Assign return value from function to a reference c++?
這是一個兩部分問題。 可以將函數的返回值賦給引用嗎? 如
Foo FuncBar()
{
return Foo();
}
// some where else
Foo &myFoo = FuncBar();
這個可以嗎? 我的理解是FuncBar()
返回一個Foo對象,現在myFoo
是myFoo
的引用。
問題的第二部分。 這是優化嗎? 因此,如果你在一個循環中這樣做很多時候做得更好
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.