スカラー構築ポリシーの実装が満たすべき要件について述べる。
ポリシーは、2相テンプレートと状態を持ち得るポリシークラスで構成される。フロントエンドのクラス名をpolicy_sample、バックエンド導出のために与えられた操作対象の型をTとすると、バックエンドのクラスは
typenamepolicy_sample::templatebind<T>::type
という記述で得られる。以降、バックエンドのクラス名をbackendと表記する。
backendは次のpublicなメンバ型を持つ。
pointer
型Tのオブジェクトを指すポインタの型。通常はT*。
const_pointer
型Tのconstオブジェクトを指すポインタの型。通常はconst T*。
reference
型Tのオブジェクトへの参照の型。通常はT&。
const_reference
型Tのconstオブジェクトへの参照の型。通常はconst T&。
backendは次のprotectedなメンバ関数を持つ。
backend()
引数なしでオブジェクトを構築する。
backend(const backend& rhs)
同型のオブジェクトrhsを用いてオブジェクトを構築する。
~backend()
オブジェクトを破壊する。
backend& operator=(const backend&)
存在しない。
void swap(backend& rhs)
自身とrhsの状態を入れ換える。
void construct(void* p)
型Tのオブジェクト1つを格納するのに充分な大きさを持つ記憶領域p上に型Tのオブジェクトを1つ構築する。構築時に引数を与えない。pが構築済みのオブジェクトを指しているとき、pのアラインメントに問題があるときの動作は未定義。
void construct(void* p, const_reference v)
型Tのオブジェクト1つを格納するのに充分な大きさを持つ記憶領域p上に型Tのオブジェクトを1つ構築する。構築時に引数vを与える。pが構築済みのオブジェクトを指しているとき、pのアラインメントに問題があるときの動作は未定義。
void destruct(pointer p)
引数pで示される記憶領域上の1つのオブジェクトを破壊する。pがconstructで構築したオブジェクトを指していないときの動作は未定義。
ポリシークラスが通常満たすべき例外安全性と計算量の条件は次の通り。
表 6.3. スカラー構築ポリシーの例外安全性と計算量
| 操作 | 例外安全性 | 計算量 |
|---|---|---|
| すべてのコンストラクタ | strong | 定数 |
| デストラクタ | nothrow | 定数 |
swap | nothrow | 定数 |
construct(p), construct(p, t) | strong | 定数 |
destruct(p) | nothrow | 定数 |