我有一个类,其中包含一个析构函数可以抛出的对象(它实际上是一个 tbb::task_group,但为了简单起见,我在这里将它命名为 MyObject)。
代码是这样的:
#include <stdexcept>
class MyObject {
public:
MyObject() {}
~MyObject() noexcept(false) {}
};
class A {
public:
A() {}
virtual ~A() {}
};
class B : public A {
public:
B() : A() {}
~B() {}
private:
MyObject _object;
};
并且编译器会引发以下错误:
覆盖函数的异常规范比基础版本更宽松
我不喜欢在整个代码中传播 noexcept(false) 的想法,所以我正在考虑使用指向 MyObject 的原始指针,并在析构函数之外删除它们(例如在 Close 函数中)。
处理这种情况的最佳方法是什么?
根据@463035818_is_not_a_number的建议,可以将投掷类包装为不投掷的自定义类。
就我而言,对于 tbb::task_group,它可能是这样的:
class TaskGroup {
public:
TaskGroup() {
_task = new tbb::task_group();
}
// This destructor will not throw.
// Not very pleased with "catch (...)" but not much choice due to TBB's implementation.
~TaskGroup() {
try {
delete _task;
} catch (...) {}
}
// Wrap any other needed method here.
private:
tbb::task_group* _task;
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句