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(**, **)
是无抛出的。
答案 0 :(得分:3)
无法保证此行不会抛出异常:
auto temp = make_unique<CImpl> (*pImpl);
所有涉及的复制构造函数都可以抛出。
因此,f()
并非强烈异常安全。