ここでは、例外仕様によるものと言われています。私はこれを理解できません。この質問は例外仕様と関係がありますか?
4 に答える
チュートリアルを読んだ後、私は言葉遣いに少し混乱しました。しかし、私はそれがこれと同じくらい簡単だと信じています:チュートリアルは、アロケータのテンプレートヘッダーが表示される理由を説明していました
allocator(const allocator&) throw();
と
template <class U> allocator(const allocator<U>&) throw();
コピーコンストラクタはアロケータにはかなり役に立たないが。そしてその答えは、アロケーターの仕様ではコンストラクターが例外をスローすることを許可していないということでした。したがって、コピーコンストラクターのパブリックインターフェイスは、例外をthrow()スローする可能性のあるコピーコンストラクターを使用して独自のアロケーターを派生させることを防ぐために、例外仕様(例外をスローしない)でコピーコンストラクターを定義します。
例外仕様が何であるかについての適切な説明については、このリンクを参照してください。(しゃれは意図されていません。本当に。)
したがって、アロケータを作成するときに、コピーコンストラクタを提供する必要があるという意味ではありませんでした。彼らは、仕様が例外をスローするものを定義することを明確に禁止していることを指摘していました。`
C ++ 03アロケータのコピーコンストラクタは例外指定子で定義する必要があるため、(デフォルトを使用するのではなく)コピーコンストラクタを明示的に作成する必要がありますthrow()。デフォルトのコピーコンストラクターには、この指定子がありません。
技術的には、そうする必要はありませんが、例外が発生した場合は...まあ、それで頑張ってください。
しかし、C ++ 03のアロケータは状態を持つことができないため、これはちょっとした煩わしさです。したがって、メンバーをコピーするべきではありません。コピーコンストラクターは空にすることができます。
コンテナーにはコピーコンストラクターがあり、プロセスでアロケーターをコピーする必要があるため、アロケーターにはコピーコンストラクターが必要です。
実はとても簡単です。アロケータを使用するコンテナのコンストラクタは、アロケータを取得してそのコピーを格納します。そのためには、アロケータがである必要がありますCopyConstructible。それで全部です。CopyAssignableそのpropagate_on_container_copy_assignment特性が真でない限り、アロケータタイプは必須ではないことに注意してください(これはまれです)。
C ++ 11仕様では、「これらの型のコンストラクター、比較演算子、コピー操作、移動操作、またはスワップ操作は、例外を介して終了してはならない」とも規定されています。例外ルールを使用すると、アロケータをコピーするとスローされることを心配せずに、アロケータの(スタック)コピーを作成できます(特に構築中または破棄中)。コピー、移動、交換、または比較を行う可能性のあるアロケータが存在する場合に例外的に安全なコンテナを設計することはほぼ不可能です。実際には、アロケータはあるリソースへのポインタ以上のものを保持することはできないため、アロケータがコピーなどをスローできるようにすると、実質的に利益が得られずに多くの苦痛が加わります。