2016-05-06 117 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();