我正在阅读C++ Faq第二版,常见问题解答第32.08页.
FAQ表示const引用传递的参数和const引用返回的参数可能导致悬空引用.
但是,如果参数通过引用传递并通过引用返回,则可以.
我得到它在const引用的情况下是不安全的但是在参数是非const引用的情况下它是如何安全的.
FAQ的最后一行说"请注意,如果函数通过非const引用接受参数(例如,f(string&s)),则返回此引用参数的副本是安全的,因为临时不能通过非const引用传递".
需要一些见解!!
如果你喜欢
const Foo & bar(const Foo &f) { return f; }
并称之为
const Foo &ret = bar(Foo());
这个编译,但问题是现在'ret'是一个悬空引用,因为调用Foo()创建的临时对象在bar返回后被释放.这里详细的执行顺序是:
临时Foo被分配
调用bar时引用临时对象
bar返回引用
现在那个酒吧已经退回临时Foo了
当物体被摧毁时,参考物现在悬空
但是,如果你把Foo声明为
Foo & bar(Foo &f) { return f; }
然后编译器不会接受你的调用栏(Foo()).将临时对象传递给函数时,只能通过const引用或作为副本获取; 这是语言定义的一部分.