3 回答

TA贡献1852条经验 获得超7个赞
通常,返回引用是完全正常的并且始终发生。
如果你的意思是:
int& getInt() { int i; return i; // DON'T DO THIS.}
这就是种种邪恶。分配的堆栈i
将消失,你指的是什么。这也是邪恶的:
int& getInt() { int* i = new int; return *i; // DON'T DO THIS.}
因为现在客户端最终必须做到这一点:
int& myInt = getInt(); // note the &, we cannot lose this reference!
delete &myInt; // must delete...totally weird and evil
int oops = getInt();
delete &oops; // undefined behavior, we're wrongly deleting a copy, not the original
请注意,右值引用仍然只是引用,因此所有恶意应用程序保持不变。
如果要分配超出函数范围的内容,请使用智能指针(或通常是容器):
std::unique_ptr<int> getInt() { return std::make_unique<int>(0);}
现在客户端存储一个智能指针:
std::unique_ptr<int> x = getInt();
参考也可以访问您知道生命周期在更高级别保持打开的内容,例如:
struct immutableint { immutableint(int i) : i_(i) {} const int& get() const { return i_; }private: int i_;};
在这里我们知道可以返回一个引用,i_
因为无论调用我们管理类实例的生命周期,所以i_
至少会存活那么久。
当然,只是:没有错:
int getInt() { return 0;}
如果生命周期应该留给调用者,而你只是计算值。
简介:如果对象的生命周期不会在调用后结束,则可以返回引用。

TA贡献1820条经验 获得超10个赞
不,不,一千次没有。
什么是邪恶的是引用动态分配的对象并丢失原始指针。当您new
成为对象时,您有义务获得保证delete
。
但是看看,例如operator<<
:必须返回引用,或者
cout << "foo" << "bar" << "bletch" << endl ;
不行。
- 3 回答
- 0 关注
- 336 浏览
添加回答
举报