gpt4 book ai didi

c++ - 如果它是未定义的行为,为什么编译器会警告返回对本地堆栈变量的引用?

转载 作者:IT老高 更新时间:2023-10-28 12:56:14 25 4
gpt4 key购买 nike

C++ 标准规定返回对局部变量(在堆栈上)的引用是未定义的行为,那么为什么许多(如果不是全部)当前编译器只有会为此发出警告?

struct A{
};

A& foo()
{
A a;
return a; //gcc and VS2008 both give this a warning, but not a compiler error
}

如果编译器对此代码给出错误而不是警告不是更好吗?

只用一个警告就可以编译这段代码有什么好处吗?

请注意,这与 const 引用无关,它可以将临时对象的生命周期延长到引用本身的生命周期。

最佳答案

几乎不可能从编译器的角度验证您是否正在返回对临时对象的引用。如果标准要求将其诊断为错误,那么编写编译器几乎是不可能的。考虑:

bool not_so_random() { return true; }
int& foo( int x ) {
static int s = 10;
int *p = &s;
if ( !not_so_random() ) {
p = &x;
}
return *p;
}

上面的程序是正确且安全的,在我们当前的实现中,保证 foo 将返回对 static 变量的引用,这是安全的。但是从编译器的角度来看(并且在单独编译的情况下,not_so_random() 的实现是不可访问的,编译器无法知道程序是否格式正确。

这是一个玩具示例,但您可以想象类似的代码,具有不同的返回路径,其中 p 可能在所有返回 *p .

关于c++ - 如果它是未定义的行为,为什么编译器会警告返回对本地堆栈变量的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6745855/

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