返回对本地int变量的引用总是未定义的行为



我已经读到,我们不应该返回指向局部变量的指针或引用。因此,在下面给出的示例中,我了解到当我在函数foo内编写:return i;时,我将返回对局部变量的引用。在函数外使用该引用将导致未定义的行为。

#include <iostream>
const int& foo()
{
int i = 5;
return i;//returning reference to a local variable
}
const int& func()
{
return 5;
}
int main()
{
const int& ref = func();
const int& f = foo();
std::cout<<f<<std::endl; //I know this is undefined behavior because we're using a reference that points to a local variable 
std::cout<<ref; //But IS THIS UNDEFINED BEHAVIOR too?
}

我的问题是,对于函数func中的返回语句return 5;,情况是否也是如此。我知道在C++17中有一个强制的副本省略。因此,我的问题是针对所有现代C++版本(C++11、C++17等(。行为是否取决于C++版本。

特别是,我知道main中的语句std::cout<<f<<std::endl;总是未定义的行为,因为我们使用的是指向局部变量的引用(悬空(。但是语句std::cout<<ref;是否也会导致未定义的行为。如果不是的话,这里会发生什么。

PS:我在第一个cout语句中描述实际发生的事情可能也是错误的。所以,如果我错了,请纠正我。

返回对本地int变量的引用总是未定义的行为

技术上没有。返回对局部变量的引用(无论类型如何(本身就是从不未定义的行为。但这样返回的引用总是无效的(如果变量是非静态的(,并且通过无效引用进行间接操作总是未定义的行为。

const int& func()
{
return 5;
}
int main()
{
const int& ref = func();
std::cout<<ref; //But IS THIS UNDEFINED BEHAVIOR too?
}

是。您通过一个无效引用进行间接引用,并且行为未定义。

最新更新