C ++代码

时间:2017-08-10 10:08:36

标签: c++ exception

struct CImpl {
    A a;
    B b;
};

class C {
    unique_ptr<CImpl> pImpl;
    ...
    void f() {
        auto temp = make_unique<CImpl> (*pImpl);
        temp->a.method1();
        temp->b.method2();
        std::swap(pImpl, temp); // no throw
    }
};

考虑上面这个例子;我们正在处理例外

(1)现在考虑a.method1(), b.method2()都是无投掷。

在这种情况下,f提供无投保证吗?我想是的。

(2)现在考虑a.method1(), b.method2()都是强有力的保证(如果抛出异常,就好像什么都没发生一样)。然后在这种情况下,我们可以保证f很强,因为我们正在使用临时值,因此如果发生异常,C仍然保持不变。

这是对的吗?所有这一切也随之而来,因为std::swap(**, **)是无抛出的。

1 个答案:

答案 0 :(得分:3)

无法保证此行不会抛出异常:

auto temp = make_unique<CImpl> (*pImpl);

所有涉及的复制构造函数都可以抛出。 因此,f()并非强烈异常安全。