【问题标题】:good or bad practice to make pure virtual functions noexcept [duplicate]制作纯虚函数的好坏习惯 noexcept [重复]
【发布时间】:2016-08-07 07:39:46
【问题描述】:

让纯虚函数 noexcept 是好还是坏?我一直认为我们不应该对它的实现类施加额外的限制,即它们的实现不应该是 throw,因为这样做可能会导致修改实现和不必要的 try catch 块以防止异常逃逸。我认为实现应该决定函数是否可以标记为 noexcept 而不是异常规范应该决定实现?

如果我在这里错了,有人可以纠正我吗?

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    noexcept 不是关于实现,而是关于接口。虚函数所代表的抽象操作是不是根本不会失败的?然后使虚函数noexcept。如果理论上操作可能会失败,即使您编写的任何实现都不会失败,也不要这样做。

    【讨论】:

      【解决方案2】:

      noexcept 是成员函数规范的一部分,与它的返回类型、参数列表和const 限定符相同。它的存在是为了帮助函数的用户 - 显然,以函数的实现者为代价。

      如果您需要在为用户提供noexcept 函数的同时为实现者提供更大的灵活性,请创建一对函数 - 一个带有noexcept 的非虚拟公共函数和一个没有noexcept 的受保护虚拟函数。使公共noexcept 函数调用虚拟实现,并处理异常以对其调用者隐藏它们:

      class Base {
      protected:
          virtual void doSomethingImpl() = 0;
      public:
          void doSomething() noexcept {
              try {
                  doSomethingImpl();
              } catch(...) {
                  // Provide some handling here
              }
          }
      };
      
      class Derived : public Base {
          void doSomethingImpl() {
              ... // Implementers have flexibility to throw here
          }
      }
      

      【讨论】:

      • 我会说如果你需要使用这个构造,那么你的设计就有问题。为了能够正确处理实现的异常,基类需要对它的派生类了解太多。
      • 我同意 MicroVirus 基类不应该对派生类做太多假设,为什么首先我总是犹豫放 noexcept 即使操作看起来太微不足道
      • @MicroVirus 像这样的东西可以用来防御在您完全无法控制实现的情况下可能会意外抛出的实现。您几乎无法处理异常并且继续,就好像什么都没发生一样,所以异常处理程序应该记录并帮助其余代码正常终止。
      猜你喜欢
      • 2010-10-16
      • 2010-11-14
      • 1970-01-01
      • 2016-04-26
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 1970-01-01
      • 2011-04-16
      相关资源
      最近更新 更多