【发布时间】:2016-08-07 07:39:46
【问题描述】:
让纯虚函数 noexcept 是好还是坏?我一直认为我们不应该对它的实现类施加额外的限制,即它们的实现不应该是 throw,因为这样做可能会导致修改实现和不必要的 try catch 块以防止异常逃逸。我认为实现应该决定函数是否可以标记为 noexcept 而不是异常规范应该决定实现?
如果我在这里错了,有人可以纠正我吗?
【问题讨论】:
让纯虚函数 noexcept 是好还是坏?我一直认为我们不应该对它的实现类施加额外的限制,即它们的实现不应该是 throw,因为这样做可能会导致修改实现和不必要的 try catch 块以防止异常逃逸。我认为实现应该决定函数是否可以标记为 noexcept 而不是异常规范应该决定实现?
如果我在这里错了,有人可以纠正我吗?
【问题讨论】:
noexcept 不是关于实现,而是关于接口。虚函数所代表的抽象操作是不是根本不会失败的?然后使虚函数noexcept。如果理论上操作可能会失败,即使您编写的任何实现都不会失败,也不要这样做。
【讨论】:
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
}
}
【讨论】: