为什么我可以返回本地int&​​amp;获得一定的价值而不是垃圾? C ++

时间:2018-02-24 19:33:57

标签: c++ return local

我想知道当你返回int&时会发生什么。让我们跳到这个例子。 我有一个简单的类Foobar存储一个int。 让我们来看看这个函数:

Foobar showObjectsValue() {
    Foobar b(50);
    return b;
}

它返回一个本地对象的副本,所以当我调用这个函数时,我实际上得到的是一些数据而不是一些垃圾。但是,当我做这样的事情时:

Foobar& showObjectsValue() {
    Foobar b(50);
    return b;
}

它返回垃圾,因为在我们退出" showObjectsValue()"的范围之后对象" b"从内存堆栈弹出,我们返回对这个弹出对象的引用(如果我错了,请更正我)。但是我不知道在返回int而不是object的情况下发生了什么。

此功能:

int& showIntegerValue() {
    int i = 50;
    return i;
}

和这个功能:

int showIntegerValue() {
    int i = 50;
    return i;
}

返回相同的值,两者都给我int = 50.那么有人可以解释在返回对本地整数和本地对象的引用时实际发生了什么吗?

1 个答案:

答案 0 :(得分:1)

  

那么有人可以解释在返回对本地整数和本地对象的引用时实际发生了什么吗?

整数对象。尝试访问已销毁对象的别名是未定义的行为。不要期待任何事情。您的编译器甚至应该向您发出警告:

main.cpp:4:9: warning: reference to local variable 'i' returned [-Wreturn-local-addr]
     int i = 50;

最后,当你处理未定义的行为时,仅仅是因为你看到的东西并不意味着它是预期的。为了进一步证明这一点,尝试使用GCC运行此代码会导致上面的警告和分段错误。