【问题标题】:How come c# can return the object and c++ can't when popping from STL containers?从 STL 容器弹出时,为什么 c# 可以返回对象而 c++ 不能?
【发布时间】:2013-11-04 01:19:52
【问题描述】:

在 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++ stl stack


    【解决方案1】:

    在 C++ 中,您返回的是集合中项目的副本,但在 C# 中,您返回的是引用。返回引用保证不会抛出异常。

    【讨论】:

      【解决方案2】:

      因为在 C# 中,操作是“便宜的”——它只是返回结构或对象引用的逐字节副本。

      在 C++ 中,返回对象是昂贵的——它需要通过调用复制构造函数来制作对象本身的副本,这实际上可能涉及用户拥有的任何东西指定必须发生,包括(但不限于)分配新资源和销毁旧资源。

      (例如,假设要返回的对象是二叉树。与复制 int 相比,复制它会非常昂贵。)

      C++11 可以使用“移动语义”来避免复制对象,但是移动语义是在 pop_back 引入之后引入的,他们并没有打扰改变它。

      【讨论】:

      • pop()类型函数不返回的论据不是效率,而是异常安全。
      • @juanchopanza:我不明白为什么它们是相互排斥的?它们对我来说都是有效的论据。
      • 它们不是相互排斥的,但如果没有异常安全保证,最好提供返回被弹出元素副本的弹出方法。 “给我一个元素的引用,我可以复制它,然后我会弹出”的成语相当笨拙,并且在多线程环境中难以同步。
      • @juanchopanza:我无法解析您所说的内容。你是说如果异常安全不是问题,那么他们会这样做吗?因为我不这么认为。
      • 我的意思是:他们会提供一些返回和弹出的弹出方法。
      猜你喜欢
      • 2017-09-10
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      • 1970-01-01
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      • 2019-05-05
      相关资源
      最近更新 更多