C++ 对局部int变量的引用

C++ 对局部int变量的引用,c++,C++,我有一个返回对死字符串的引用的坏函数: std::string & ffff() { std::string j = "12346"; return j; } 如果我调用std::string ii=ffff()我崩溃了。这是正确和可以理解的 但现在我有了一个返回int的引用的函数: int & ff() { int g = 1; return g; } 我不明白为什么我在尝试将“dead”的引用intg分配给inti变量时没有崩溃 int i =

我有一个返回对死字符串的引用的坏函数:

std::string & ffff()
{
    std::string j = "12346";
    return j;
}
如果我调用
std::string ii=ffff()我崩溃了。这是正确和可以理解的

但现在我有了一个返回int的引用的函数:

int & ff()
{
  int g  = 1;
  return g;
}
我不明白为什么我在尝试将“dead”的引用
intg
分配给
inti
变量时没有崩溃

int  i = ff();

C++标准不包含“崩溃”的概念。没有符合标准的、确定性的机制可以“导致崩溃”


您的程序的行为是未定义的,因此语言标准没有描述将会发生什么和应该发生什么。

正如已经说过的,您处于“未定义行为”的境地,您应该期待:可能不“正确和可理解”的行为

如果您想了解编译器在做什么,请查看生成的汇编程序。在那里,您将能够看到发生了什么,以及为什么会发生崩溃

我的猜测(尽管我可能错了)是字符串在退出函数时被破坏,因此它显然是一个“死字符串”(使用您自己的术语,不是一个非常严格的术语)。另一方面,返回一个整数的引用。。。int不是“销毁”的,因为它不是一个对象。编译器可能会执行一个传递值来简化事情——您返回一个引用以立即复制它吗?编译器应该能看穿这一点。即使您将它封装在一个对象中,int的内存也是恒定的,因此它应该仍然存在,即使在被销毁时也可能可用


无论如何,我看到你被否决了,因为这本身不是一个很有趣的问题。你在问为什么某些东西在使用糟糕的编程实践时不会崩溃,这不是建设性的——我不会投反对票,因为我也是一个真正的古玩程序员;)

请定义“未定义的行为”。它可能会工作一百万次,并且肯定会发生在客户系统+1的关键操作中(标准没有说明会发生什么,但在1.3.25中定义了未定义的行为)