gpt4 book ai didi

c++ - 未定义的行为和临时性

转载 作者:IT老高 更新时间:2023-10-28 22:39:26 25 4
gpt4 key购买 nike

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;
}

最佳答案

2) Is it undefined behavior to simply have a reference to an object that no longer exists, even if that reference is not used?

没有。引用必须引用有效对象的规则在引用被初始化时适用。该规则已在评论中引用:“应初始化引用以引用有效的对象或函数。”您的程序中没有违反此规则,并且在引用方面没有其他限制,要求它们在初始化后引用有效的对象或函数。

该标准有一些涉及悬空引用的示例,例如 [class.temporary]5.4:

struct S { int mi; const std::pair<int,int>& mp; };
S a { 1, {2,3} };
S* p = new S{ 1, {2,3} }; // Creates dangling reference.

并没有针对任何此类示例说仅存在悬空引用是无效的。虽然从未明确表示允许,但没有任何禁止它的规则就足以允许它。

1) Is it undefined behavior to return a reference to a temporary, even if that reference is not used?

没有。结果的构造(引用的初始化)发生在被调用函数的上下文中。在构造结果之后运行的被调用函数中甚至可能有额外的代码:本地对象的析构函数在结果构造完成后运行。由于引用被初始化为有效对象,这就像您的第二个问题一样,仍然没有违反相同的规则。

3) Is it undefined behavior to combine these?

是的。在您的示例中, p 未初始化为引用有效的对象或函数。从对问题的评论中可以看出,标准中的措辞存在问题,但这条规则的意图很明显,如果违反,行为是未定义的。

关于c++ - 未定义的行为和临时性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33790065/

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