返回对Local变量的引用是否正常?

时间:2017-07-15 11:22:46

标签: c++ reference

我已经知道当程序超出其范围时,该变量将被销毁。但是,当我尝试以下代码段中的代码时似乎没有发生这种情况:

    int& somethin()
    {
        int x1 = 4;

        return x1;
    } 
    int main() {    
        int x11; 
        x11 = somethin();
        cout << x11 << endl;

        return 0;
    }

令人惊讶的是,输出是:4

当我将“x11”声明为引用变量时,我得到了垃圾值。

任何解释?

注意:我多次重复这个测试。我不认为这是运气。 注意:有一个人在StackOverflow之前提出了同样的问题,答案是关于测试人员是幸运的。

2 个答案:

答案 0 :(得分:3)

  

有任何解释吗?

行为未定义。

标准不保证未定义的行为会产生您期望的行为。它也不保证行为始终相同。在我的电脑上,结果是一个段错误。

对于它的价值,您可以想象实现:x1存储在内存中的某处,因此值4在内存中的某处。在函数调用之后,该内存不再用于x1,因此它可以用于其他内容。 x11存储在内存中的某个位置。如果恰好使用相同的内存位置,则该内存位置中的垃圾值可能恰好为4。

  

当我将“x11”声明为引用变量时,我得到了垃圾值。

4也是垃圾值。

答案 1 :(得分:1)

本地变量存储在自动存储中。当它们超出范围时,它们就会被摧毁。

返回对局部变量的引用违反了语言规则,因此undefined behaviour(就像取消引用nullptr一样)。

话虽如此,但无法保证x11的价值。它可以产生正确的结果,但这不是语言功能。

您可以在此处找到有关undefined behaviour的更多信息: What are all the common undefined behaviours that a C++ programmer should know about?