函数返回值的范围

时间:2016-05-06 08:31:50

标签: c++ scope

class obj {
};

obj func() {
    return obj();
}

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

按值返回对象的函数的返回值的范围是多少? 换句话说,在调用此函数的范围内,是否可以获取由值对象返回的引用?

3 个答案:

答案 0 :(得分: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 :(得分: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 :(得分:1)

语言不允许采用临时的非常量引用,但是可以:

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