【发布时间】:2018-07-21 03:53:46
【问题描述】:
这个问题涉及函数堆栈和引用成员(我读到的通常被认为是不好的做法)。我的测试代码:
#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++ 中引用、指针和动态内存如何工作的情况下提出的。任何为此苦苦挣扎的人,我建议阅读这些内容。
【问题讨论】:
-
当你使用引用时,它引用了原始存储地址。 score 因此包含幻数 123 的地址,它在您的应用程序运行时不会“销毁”。
-
这是有道理的。有没有人愿意建议我为什么这个问题被认为是不好的(反对票),以便我将来可以写出更好的问题?我相信没有违反 Stackoverflow 规则。
-
别担心。人们应该在这里投票的标准是他们是否认为帖子“有用”。正如您可能猜到的那样,这取决于解释和投票者的恶劣情绪。所以,从容应对吧。
-
s的生命周期不会通过函数范围而延长。const int& score;不是函数本地的。它是一个数据成员。这是 UB。 -
你有未定义的行为ideone.com/4FXakx
标签: c++ constructor scope reference