如果我正确理解以下内容,请告诉我。
我有类型A
。假设我想实现一个运算符,该运算符A& operator=(const A& a)
对这种类型的异常有很强的保证。也就是说,在失败的情况下,运算符会抛出异常,但该类型的对象A
仍保持其原始状态。
问题是该类型A
包含许多字段,而这些字段又包含其他字段,并且在内部的某个地方有一个类型字段Z
。千百年来,一种类型Z
为其运营商的异常提供了强有力的保证Z& operator=(const Z& z)
,但是在可怕的一天,这个保证被打破了,没有人看到它。
问题如下。
- 构图真的那么脆弱吗?
- 您如何检测类型字段何时
Z
开始违反A& operator=(const A& a)
在执行语句时所有操作链都处于强异常保证之下的保证? - 如果我们转向指针的组合(智能)而不是值的组合,是否有可能克服这种脆弱性?实际上,在这种情况下,可以通过调用
Type::Uptr Type::Clone() const
. 移动更容易实现 - 只需更改指针的值。在我看来,这更容易分析和跟踪,但我不确定这一点。
是的,你是对的:智能指针提供了保证,甚至不依赖于字段保证。指针类本身
A
保留了与非指针实现相同的接口: