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

C++ 通过引用返回局部变量仍然显示正确的值,c++,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(); A; a=func(); cout因为代码的行为是未定义的,并且至少在一种情况下看起来工作正常是未定义行为的可接受表现 您可

我有这门课:

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();
A;
a=func();

cout因为代码的行为是未定义的,并且至少在一种情况下看起来工作正常是未定义行为的可接受表现


您可能会得到
“777”
:以NUL结尾的
常量字符[4]
类型。

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

不幸的是,根据我的经验,在这方面有两件坏事:

  • 由于编译器的结构,引用通常是“表面上”正确的,如您的示例中所示
  • “returnreferencetotemporary”只发出编译器警告,而不是错误
这两件事加在一起使得这个问题非常危险,因为它很容易被忽略,甚至可以工作多年。。。直到那次非常重要的演讲那天


解决方案是将此警告视为错误(有关编译器标志,请参阅编译器文档),或者更好地将所有警告视为错误。

是什么使该值准确地“正确”?你刚才不是说你知道你不应该得到那个值吗?如果你不应该得到它,它怎么可能是对的?可能的重复可能的重复我在商店偷了一块饼干,但我仍然没有进监狱。这能证明偷饼干是合法的吗?显然,我真的不明白为什么这个问题应该得到7(七)个否决票。它有一个最小的、完整的(好的,完整的,除非你不是太笨,不能键入两个平凡的getter和一个main函数)示例,它显示了一个清晰的问题和一个清晰的问题。