关于在C++中返回引用的函数的问题

Rag*_*ava 7 c++ reference

可以从函数返回对局部变量的引用吗?通过本地我的意思是变量将在函数内创建(在堆栈上,即不使用new),并且其范围仅在该函数内.当我搜索这个时,我得到了相互矛盾的答案.1)说这种用法是正确的,但2)与之相矛盾.

1)http://functionx.com/cpp/examples/returnreference.htm
2)http://www.cprogramming.com/tutorial/references.html(参考和安全部分下)

哪一个是对的?

我的另一个问题是,如果1)是正确的,那么以下是相同的目的.

i)int&a = func();
ii)int a = func(); 其中func()返回对int的引用(该函数中的局部变量).

在上述两种情况下,都没有复制涉及的返回值.我想防止复制返回值,因为返回值可能很大.

先感谢您.

Raghava.

Chu*_*dad 6

您可以在函数中返回对静态局部变量的引用.否则,它是灾难的处方,因为一旦函数返回,局部变量就会被销毁.

以下内容可能会有所帮助,您将在第一篇参考文献中引用相同的示例.

编辑2:

对于帖子中的第ii点,让我们假设一个函数'fn',如图所示

int& fn(){
static int x;
return x;
}

int a = fn();
Run Code Online (Sandbox Code Playgroud)

这涉及来自表达式'fn'的左值的副本.

它不涉及副本,如果是的话

int &a = fn();
Run Code Online (Sandbox Code Playgroud)


Dav*_*ley 6

正如其他人所说的那样,不要这样做.返回引用或指向局部变量的指针总是错误的,因为返回的行为会删除局部变量,因此引用或指针自动无效.

复制可能不是问题.从函数返回时,允许C++编译器跳过复制构造函数("返回值优化"),因此足够智能的编译器可能能够构建适当的值.因此,您可以在不进行任何复制的情况下返回较大的值.试试看吧; 你可以暂时将输出语句放在复制构造函数中(如果你已经编写了一个并且没有使用自动生成的语句)来查看它是否实际被调用.

因此,如果没有运行和尝试,您不知道是否有实际的复制正在进行,如果是,那么它有多大的问题.与往常一样,时间和概况运行以查看是否存在问题,如果存在问题,请在何处进行.在计时和分析之前,做任何冒险和/或混乱以加速性能的事情几乎都不值得做.


Edw*_*nge 5

如果你的意思是函数内部的一个变量,那么...它总是无意义的返回它的引用.从成员函数返回对成员变量的引用是完全正常的.

至于希望避免复制大型数据结构.请等到你有实际的个人资料数据显示你是a)实际制作副本,b)它实际上是一个瓶颈."过早优化是所有邪恶的根源",可能有点极端,但过早的优化肯定会导致很多痛苦和麻烦,而很少,如果有的话,实际上提供了这些尝试所要达到的任何好处.