为什么 c# 可以返回对象,而 c++ 在从 STL 容器弹出时不能
本文关键字:STL 不能 在从 c++ 返回 对象 为什么 | 更新日期: 2023-09-27 18:36:58
在 C# 中,当您从堆栈中弹出时,它会从堆栈中删除对象并返回对象。
但是,在C++中,由于 http://blogs.msdn.com/b/zhanli/archive/2010/06/29/c-tips-why-the-pop-method-of-stl-stack-does-not-return-a-value.aspx,pop 函数不会返回对象。
是什么让 C# 能够做一些C++做不到的事情?还是更像 C# 不在乎这种异常情况是否发生?"如果 operator= 或复制构造函数抛出异常,那么我们将遇到麻烦:堆栈的内部状态已更改,但我们尚未获得弹出的元素。"(来自链接)
在C++中,您将返回集合中项的副本,但在 C# 中,您将返回引用。返回引用保证不会引发异常。
因为在 C# 中,操作是"便宜的"——它只是返回结构或对象引用的逐字节副本。
在C++中,返回对象是昂贵的 - 它需要通过调用复制构造函数来制作对象本身的副本,这实际上可能涉及用户指定的任何事情都必须发生,包括(但不限于)分配新资源和销毁旧资源。
(例如,假设要返回的对象是二叉树。与复制相比,复制它会非常昂贵,比如说,一个int
。
C++11 本可以使用"移动语义"来避免复制对象,但移动语义是在pop_back
之后引入的,他们没有费心更改它。