通过引用返回局部变量仍然显示正确的值

时间:2017-12-05 10:38:59

标签: c++

我有这堂课:

class A
{
private:
    int a;
public:
    int getA();
    void setA(int a=2) ;
};

和一个功能:

A& func()
{
A a;
a.setA(777);
return a;
}

并在主要:

A a;
a=func();
cout<<a.getA();

我得到“777”。 但据我所知它不应该给我任何价值,因为函数中的本地“a”已被删除。那为什么我会得到正确的价值?

2 个答案:

答案 0 :(得分:1)

因为代码的行为是 undefined ,并且至少在一次场合看似正常工作是未定义行为的可接受表现。

您可能会得到"777":NUL终止的const char[4]类型。

答案 1 :(得分:0)

像Bathsheba已经回答的那样,返回对临时变量的引用会导致未定义的行为。

不幸的是,根据我的经验,有两个不好的事情在这里:

  • 由于编译器的结构,引用通常会“看似”正确,就像在您的示例中一样。
  • “返回临时引用”只发出编译器警告,而不是错误!

这两个问题一起使得这个问题非常危险,因为它很容易被错过并且甚至可以工作多年......直到那个非常重要的演示日。

解决方案是将此警告视为错误(请参阅编译器的编译器标志文档)或 - 甚至更好 - 将所有警告视为错误。