为什么 c# 可以返回对象,而 c++ 在从 STL 容器弹出时不能返回?
How come c# can return the object and c++ can't when popping from STL containers?
在 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
之后引入的,他们没有费心更改它。
相关文章:
- 检查函数返回类型是否与STL容器类型值相同
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 如何在不使用 STL 的情况下从函数反转字符串后返回字符串C++?
- 模板化函数以从输入参数推断返回类型 stl-container
- lower_bound 在 C++ STL 中返回迭代器,即使元素不存在也是如此.如何避免这种情况?
- STL查找功能从Deque返回了什么
- 整数和元组的静态 STL 映射返回 0
- 为什么value_type函数返回SGI STL中的指针
- 在STL地图中通过参考查找并返回
- STL模板功能返回一对
- 使用PYBIND11包装STL容器返回类型
- 从DLL导出STL类-为什么返回类型没有警告
- 将适当类型的迭代器作为参数返回适当类型的STL容器
- 从函数复制成本返回STL向量
- stl数据结构的堆栈上输出参数与返回值的效率
- 为什么 c# 可以返回对象,而 c++ 在从 STL 容器弹出时不能返回?
- C++ STL容器集和多集:不同返回类型的插入操作
- 通过引用返回stl map的正确方法/此行为是否定义良好?
- 从函数返回 stl 容器
- 从函数返回STL对象而不触发move