【发布时间】:2015-11-18 20:49:09
【问题描述】:
1) 返回对临时对象的引用是否是未定义的行为,即使该引用未被使用?例如,这个程序是否保证输出“好”:
int& func()
{
int i = 5;
return i;
}
int main()
{
func();
cout << "good" << endl;
return 0;
}
2) 简单地引用一个不再存在的对象是否是未定义的行为,即使该引用未被使用?例如,这个程序是否保证输出“好”:
int main()
{
int *j = new int();
int &k = *j;
delete j;
cout << "good" << endl;
return 0;
}
3) 将这些结合起来是未定义的行为吗?
int& func()
{
int i = 5;
return i;
}
int main()
{
int& p = func();
cout << "good" << endl;
return 0;
}
【问题讨论】:
-
@wendelbsilva,知道问题的历史,我可以告诉你,OP 需要一些东西来证实你的陈述;)
-
1 和 2 应该没问题 - 我不知道它们违反了任何规则,尽管很难证明是否定的。 3 对于 [dcl.ref]/5 更棘手(“应初始化引用以引用有效的对象或函数。”),但该语言显然是有缺陷的(它需要诊断,这显然是不可能的),所以应该发生什么还不清楚。
-
@DavidSchwartz 不,这对于指针来说并非完全没问题。您的第三个问题的指针等效项具有 UB。 (至少在 C 中肯定如此,我高度怀疑 C++ 并没有改变这一点。)
-
此代码不返回对临时的引用。它返回对对象
i的引用。 -
@Lao 这取决于您是指“有效代码”是“不会在我的系统上崩溃的代码”还是“遵循 C++ 规范定义的规则的代码”。正如您所建议的那样,前者是您只需尝试即可回答的问题,但这个问题是关于后者的。
标签: c++ language-lawyer undefined-behavior temporary-objects