为何返回函数默认实参的引用合法?为何f()不返回悬垂引用?
问题解答
先看你给出的代码:
#include <iostream> //class for testing** class T { public: void print() { std::cout << "hello\n"; } ~T() { std::cout << "~T\n";} }; //function for testing T& f(T&& obj = T()) { return obj; } int main() { f().print(); // outputs first "hello", second "~T" }
为什么返回默认实参的引用合法且不会产生悬垂引用?
你觉得默认实参是局部变量其实是个误解,这里的默认实参T()是一个临时对象,不是函数f内部的局部变量。
按照C++标准的规定:当临时对象被用作函数的默认实参时,它的生命周期会被延长到包含该函数调用的完整表达式结束时。在你的代码里,f().print()就是一个完整表达式——从调用f()开始,到print()执行完毕,整个表达式才算结束。
再看函数f的参数是T&&(右值引用),它可以合法绑定到临时对象T()上。函数返回的引用就是绑定到这个临时对象的引用,而这个临时对象的生命周期一直持续到print()调用完成之后才会销毁,所以在print()执行的时候,引用指向的对象是有效的,不会出现悬垂引用的问题。
这就是为什么程序会先输出hello(print()的结果),再输出~T(临时对象销毁时的析构函数调用结果)。
内容的提问来源于stack exchange,提问作者Kappy
相关产品推荐
相关产品推荐

