答えるの過程では別の質問を私が少し異なる文言につまずいたstd::vector::erase()
とstd::deque::erase()
。
これはC ++ 14が言っていることですstd::deque::erase
([deque.modifiers]/4-6
私の強調):
効果: ...
複雑さ:デストラクタへの呼び出しの数は消去された要素の数と同じですが、代入演算子の呼び出しの数の数は、消去された要素の前の要素の数と後の要素の数の小さい方以下です消去された要素。
スロー:コピーコンストラクター、移動コンストラクター、割り当て演算子、または移動割り当て演算子によって例外がスローされない限り、何も発生しません。
T
。
そして、これがstd::vector::erase
([vector.modifiers]/3-5
)について言っていることです:
効果: ...
複雑さ:のデストラクタは
T
、消去された要素の数と等しい回数と呼ばれますが、移動代入演算子はT
、消去された要素の後のベクトル内の要素の数と等しい回数と呼ばれます。スロー:のコピーコンストラクター、移動コンストラクター、割り当て演算子、または移動割り当て演算子によって例外がスローされない限り、何も起こりません
T
。
ご覧のとおり、両方の例外仕様は同じですが、std::vector
代入代入演算子が呼び出されることが明示されているためです。
以下のための要件もありますT
されるようにMoveAssignable
するためにerase()
、両方との仕事にstd::vector
とはstd::deque
(表100)が、これは移動代入演算子の存在を意味するものではありません。一つはコピー代入演算子を定義し、移動代入演算子を定義することはできませんが、このクラスの意志をであるMoveAssignable
。
念のため、GCCとClangで確認しました。実際にstd::vector::erase()
移動代入演算子がない場合は、コピー代入演算子を呼び出しstd::deque::erase()
、同じことを行います(デモ)。
だから問題は、私は何かを逃したのか、またはこれは規格の(編集上の)問題なのか?
更新:LWGの問題#2477を 送信しました。