返回对本地临时对象的引用

时间:2015-02-02 10:11:03

标签: c++ ios xcode objective-c++ irrlicht

此代码

virtual const core::matrix4& getViewMatrixAffector() const {return core::matrix4();};

结果,警告告诉我“返回对本地临时对象的引用”......

如何解决此警告?

如下所述,我试图删除'&'... Error

5 个答案:

答案 0 :(得分:3)

由于您无法控制返回类型,因此必须确保返回有效对象而不仅仅是临时对象。一种解决方案是函数本地静态变量:

virtual const core::matrix4& getViewMatrixAffector() const
{
  static const core::matrix4 val;
  return val;
};

如果您发现自己在许多函数中执行此操作(使用相同类型的变量),请使val成为该类的(适当重命名的)静态成员。

答案 1 :(得分:1)

当您通过引用返回时,如core::matrix4&中所示,您需要一个在函数返回时仍然存在的对象。在您的情况下,您将返回一个“本地临时对象”,该函数退出后将被销毁。为了解决这个问题,你需要按值返回,如下所示:

virtual const core::matrix4 getViewMatrixAffector() const {return core::matrix4();};
//                        ^ no '&'

答案 2 :(得分:1)

当您将对象创建为本地临时对象时,只要函数的作用域结束,它就会被销毁。反过来,你永远不应该返回对它的引用,因为这会产生未定义的行为。 请考虑按值返回,或者将智能指针返回到免费商店中的对象。

答案 3 :(得分:1)

即使引用在函数外部有效,英特尔C ++ 14.0.3.202也会发出此警告。这只是我在这个版本中看到的一个错误,但它也可能出现在其他版本中。如果您使用此版本:只需通过以这种方式包装您的函数来屏蔽警告:

#pragma warning(push)
#pragma warning(disable:473)
( your function definition )
#pragma warning(pop)

我不确定473是否是此警告的索引 - 但您在计算机的消息中看到了正确的索引。

答案 4 :(得分:0)

如果它确实是一个本地对象,你将返回一个引用,那么你不应该这样做,因为一旦函数getViewMatrixAffector()返回,该对象将无效。