カーギルウィジェットの例を解決するためのJonKalbの強力な例外安全コードを考えると、コンパイラが操作を再編成してコードを強力に例外安全ではないようにするのを妨げるものは何ですか?
#include <algorithm> // std::swap
template< typename T1, typename T2 >
class Cargill_Widget
{
public:
Cargill_Widget& operator=( Cargill_Widget const& r_other )
{
using std::swap;
T1 temp_t1( r_other.m_t1 ); // may throw
T2 temp_t2( r_other.m_t2 ); // may throw
/* The strong exception-safety line */
swap( m_t1, temp_t1 ); // no throw
swap( m_t2, temp_t2 ); // no throw
return *this;
}
private:
T1 m_t1;
T2 m_t2;
};
それは「コンパイラは観察可能な振る舞いを変更できない」というルールですか?
参照:
- Jon Kalbの「例外安全コード」プレゼンテーションスライド: http: //www.exceptionsafecode.com/slides/esc.pdf