次の構造が原因私はnoexcept
として移動代入演算子を宣言しているという事実のためにC++ 11の下でコンパイルに失敗します。コンパイラによって生成されるデフォルトの移動代入演算子が原因事実にnoexcept(false)
あるデフォルトの特別なメンバー関数をnoexceptにすることはできますか?
struct foo
{
std::vector<int> data;
foo& operator=(foo&&) noexcept = default;
};
そのstd::vector<int>
の移動割り当てはnoexcept(false)
です。これは、デフォルトのアロケータがstd::allocator_traits<T>:: propagate_on_container_move_assignment
がstd::false_type
に設定されているためです。 this questionも参照してください。
これはC++ 14で修正されていると思います(library defect 2103参照)。
私の質問は、自分で定義することなく、デフォルトの移動代入代入演算子にnoexcept
を強制する方法がありますか?
これが可能でない場合はをnoexcept
に割り当てることができますか?noexcept(true)
が私の構造体に渡されるように割り当て可能ですか?
が、それは大丈夫です::ベクトル ' 'A'はデフォルトの' std :: allocator 'ではありません? –
aschepler
私は、コードの複雑さを最小限に抑えるために探しています。私はカスタムアロケータを使用することは、他のコーダが単純な非デフォルト移動代入演算子よりも理解するのが難しいと予想しています。 – marack
これは、 'std :: vector'の 'A'がデフォルトのアロケータのための単純なインラインラッパーであれば、それは働くかもしれません... –
marack