为什么 c# 可以返回对象,而 c++ 在从 STL 容器弹出时不能返回?

How come c# can return the object and c++ can't when popping from STL containers?

本文关键字:返回 STL 不能 c++ 对象 为什么 在从      更新时间:2023-10-16

在 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之后引入的,他们没有费心更改它。