C++ 从c+;返回引用时会发生什么+;功能?

C++ 从c+;返回引用时会发生什么+;功能?,c++,memory,reference,C++,Memory,Reference,问题不在于为什么以及何时应该使用它。我想知道在低级阶段到底发生了什么,因为我们得到了非常奇怪的结果 例如,当您这样使用它时,很明显: int&func(int&num){ ++num; 返回num; } 在这里,我们通过引用传递一个变量,对其进行更改,然后返回对同一变量的新引用 但如果我们这样做会发生什么 int&func(int-num){ ++num; 返回num; } 函数func完成后,变量num不再存在。C++不允许创建引用而不使用变量初始化它们。但在这种情况下,编译和执行都不会出

问题不在于为什么以及何时应该使用它。我想知道在低级阶段到底发生了什么,因为我们得到了非常奇怪的结果

例如,当您这样使用它时,很明显:

int&func(int&num){
++num;
返回num;
}
在这里,我们通过引用传递一个变量,对其进行更改,然后返回对同一变量的新引用

但如果我们这样做会发生什么

int&func(int-num){
++num;
返回num;
}
函数
func
完成后,变量
num
不再存在。C++不允许创建引用而不使用变量初始化它们。但在这种情况下,编译和执行都不会出错。例如,如果我们不初始化
int
,我们会得到随机行为:

int-num;

std::cout从函数返回对局部变量的引用没有错。但是,使用该引用会导致未定义的行为。

好吧,我用
g++5.4.0版编译了您的代码

所以我一直在想:

  • 为什么我们没有得到一个编译错误,返回对一个不存在的对象的引用
  • 编译器不会给出错误,但会给您一个警告

    sampe.cpp: In function ‘int& func(int)’:
    sampe.cpp:6:15: warning: reference to local variable ‘num’ returned [-Wreturn-local-addr]
     int& func(int num)
                   ^
    
    此外,您不会返回对不存在的对象的引用。当您返回引用时,对象(或者更确切地说是
    int
    )存在并且不在范围之外。一旦执行了
    return
    语句,它就超出了范围

    这就是编译器编译代码并给出警告的原因

    sampe.cpp: In function ‘int& func(int)’:
    sampe.cpp:6:15: warning: reference to local variable ‘num’ returned [-Wreturn-local-addr]
     int& func(int num)
                   ^
    
  • 分配给num2的是什么
  • 为什么它不会导致任何执行错误,而只是停止程序
  • 现在,当我执行程序时,每次都会出现
    分段错误
    (没有任何输出)。快速使用
    gdb
    告诉我

    int num2(func(num1));
    
    main()
    中是罪魁祸首。这就是我的程序崩溃的地方

    ====================================================

    TLDR

    正如@Hi-love SO对您的问题和答案的评论中所述,很明显,返回对局部变量的引用没有什么错


    可能您只是在使用一个旧的编译器,当您的程序进入未定义的行为区域时,它能够以某种方式为您提供输出。

    您在@S.Ellis中。可以使用相同的“hotel room”参数作为参考,在这方面没有区别。@S.Ellis如果有帮助,编译器通常将引用实现为机器地址(就像指针一样)。所以返回的是变量以前占用的地址。引用绝对会占用内存,在某些情况下,它们可能会优化为原始变量。基本上可以把引用看作是非空的PoTITIT,在编写和推理C++代码时,将它们看作别名是有用的。当编译后的代码在实际硬件上运行时,它们通常作为指针实现,因为地址是对象的“名称”。在这种情况下,对象的名称在对象被销毁后仍然存在,并且如果该对象仍然活着,则使用该引用(或指针)是一个错误。有人可能会说,返回您无法以保存方式使用的内容是错误的。@Unlikus您可以这样说,当然。但是返回那个悬而未决的引用和实际尝试使用它之间有很大的区别。仅返回它是有效的,但使用它会导致整个程序无效。