抛出数据成员的析构函数

你来

我有一个类,其中包含一个析构函数可以抛出的对象(它实际上是一个 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章