此代码未定义,为什么运行?我怎么崩溃了?

0 c++

我在Visual studio中运行了下面的代码,并期望得到运行时或某种错误.我一无所获,绝对没有.我得到了输出代码9,注释出来并获得了3.我在键盘上运行它并且它也没有给我任何错误.

是否有编译器会告诉我这段代码不正确?如果它是正确的,为什么呢?我知道const A&是合法的,但下面的AFAIK不是.

class A
{
public:
    int v;
    A& get()
    {
        return *this;
    }
};

A& func()
{
    A a;
    a.v=3;
    return a.get();
}

int main()
{
    A& v = func();
    v.v=9;
    return v.v;
}
Run Code Online (Sandbox Code Playgroud)

Edw*_*nge 6

未定义的行为是未定义的行为.你不能指望它特别做任何事情,包括崩溃.

没有我知道的编译器可以捕获所有类型的UB,我认为不可能.您可以提高编译器的警告级别,但我认为它甚至不会警告您.我相信,使用get()作为捕获对局部变量的引用的方法,将有效地隐藏这一事实,即如果不是所有编译器,这就是你正在做的事情.在我看来,抓住这种自杀事件所需的努力量似乎不值得.

这只是C++开发人员生活的一部分.


Joh*_*ick 5

它正在工作,因为实例存储的内存尚未被覆盖.这显然不会在真正的项目中飞行.