2016-05-06 122 views
3
class obj { 
}; 

obj func() { 
    return obj(); 
} 

int main() { 
    obj& o = func(); // possible? 
} 

函數返回值的返回值的範圍是什麼? 換句話說,在調用這個函數的範圍內,是否可以接受值對象返回的引用?函數返回值的範圍

+2

常量OBJ&O = FUNC(); //可能 – AnatolyS

+0

所以參考是有效的。 const是否相容? – mkmostafa

+1

[非常量引用如何不能綁定到臨時對象?](http://stackoverflow.com/questions/1565600/how-come-a-non-const-reference-cannot-bind-to -a-temporary-object) – LogicStuff

回答

2

是的,你可以綁定到一個函數的返回值的參考。這將返回對象的生命週期擴展爲引用的生命週期(如果它是全局的或本地函數的),或者延伸到當前函數的末尾(如果引用是數據成員)。

但是,您不能將臨時(prvalue)綁定到非const左值引用。因此,它是這樣的:

obj& o = func(); // illegal, because non-const lvalue ref 
const obj& o = func(); // fine, lifetime extended 
obj&& o = func(); // fine, lifetime extended 
2

你不能採取臨時的非const引用。

你可以做

  • obj o = func(); // new obj created but copy constructor may be ellided
  • const obj& o = func(); // lifetime extended
  • obj&& o = func(); // lifetime extended
+1

你能解釋爲什麼「非const」是無效的嗎? – mkmostafa

+0

@mkmostafa:在數以千計的現有問題上都有很好的覆蓋,更不用提你的C++教科書了。 –

1

它不是由語言允許採取的臨時非const引用,但是,您可以:

const obj& o = func(); 
// or 
obj&& o = func(); 
// or simply 
obj o = func();