为什么编译器允许函数返回存储为引用的值

时间:2010-04-12 18:54:37

标签: c++ reference compiler-errors

有人能解释为什么这段代码不会产生编译错误吗?

class Foo
{
   public:
      int _x;
};

Foo getFoo()
{
   Foo myfoo;
   myfoo._x = 10;
   return myfoo;
}


int _tmain()
{
   // shouldn't this line of code be a compiler error?
   Foo& badfoo = getFoo();

   return 0;
}

5 个答案:

答案 0 :(得分:4)

这应该是一个编译错误,尽管如果它不是

const Foo& badfoo = getFoo();

由于有一个特殊规则可以延长绑定到常量引用的临时值的生命周期,但仅限于常量引用,而不是任何引用。

您发布的代码给了我预期的编译错误

  

错误:初始化无效   'Foo&'类型的非常量引用   来自临时的'Foo'

在G ++ 4.3.2上。您使用的是哪种编译器?

答案 1 :(得分:4)

您可能正在使用VC ++,它允许将其作为扩展名。

main.cpp:18: warning C4239: nonstandard extension used : 
'initializing' : conversion from 'Foo' to 'Foo &'

答案 2 :(得分:0)

没有。 getFoo()返回一个值,这意味着将分配一个临时副本,引用将引用该副本。

答案 3 :(得分:0)

您可以绑定对临时对象的引用,它们具有引用本身的生命周期。

另一方面,如果getFoo返回Foo&,则会遇到一些问题,因为当getFoo函数结束时,对象的生命周期将结束。由于您没有返回对内部数据的引用,而是返回该数据的副本,因此您没问题。

答案 4 :(得分:-1)

getFoo方法也可以是这样的:

 Foo getFoo() 

{
   Foo* myfoo = new Foo();
   myfoo->_x = 10;
   return *myfoo;
}

这没关系......编译器无法知道所有事情:)