gpt4 book ai didi

c++ - 使用超出范围的引用成员

转载 作者:太空狗 更新时间:2023-10-29 19:56:26 24 4
gpt4 key购买 nike

这个问题涉及函数堆栈和引用成员(我读到的通常被认为是不好的做法)。我的测试代码:

#include <iostream>
using namespace std;

struct Person
{
Person(const int& s) : score(s) {}
const int& score;
};

int main()
{
Person p(123);
cout << "P's score is: " << p.score << endl;
return 0;
}

我们在 Person 的构造函数中创建了一个整数对象。模板对象是由于将 int 转换为 &int 而创建的(这就是我们需要 const 的原因)。然后我们将得分点设置为构造函数的参数。最后,我们退出构造函数并销毁参数。

输出:

P's score is: 123

如果参数被销毁,为什么我们仍然得到值 123?如果我们将参数复制给成员,这对我来说是有意义的。我的逻辑告诉我,该成员会指向一个明显不正确的空位置。也许这个论点并没有真正被破坏,而是它超出了范围?

当我读到这个问题时出现了这个问题:Does a const reference prolong the life of a temporary?

我发现 Squirrelsama 的回答很清楚,在我尝试这段代码之前我认为我理解了。

2018 年 2 月 12 日更新:有关此的更多信息: What happens when C++ reference leaves it's scope?

2018 年 2 月 18 日更新:这个问题是在不清楚 C++ 中的引用、指针和动态内存如何工作的情况下提出的。任何为此苦苦挣扎的人,我建议阅读这些内容。

最佳答案

How come we are still getting the value 123 if the argument was destroyed?

因为没有什么可以保证您不会。在 C++ 中,访问一个生命周期已结束的对象(并且当您访问它时您的临时对象已死)会导致未定义的行为。未定义的行为并不意味着“崩溃”或“得到空结果”。这意味着语言规范没有规定结果。您无法从纯 C++ 的角度推断程序的结果。

现在可能发生的是,您的 C++ 实现为该临时文件保留了存储空间。即使 可能p 初始化后重用该位置,但这并不意味着它必须这样做。因此,您最终靠运气读到了“正确的值(value)”。

关于c++ - 使用超出范围的引用成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48721729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com