std::vector
再割り当てに使用移動セマンティクスを強制する唯一の方法(C ++ 17以前の場合)は、コピーコンストラクターを削除することです:)。このようにして、コンパイル時にmoveコンストラクターを使用するか、試行錯誤します:)。
std::vector
再配置時にmoveコンストラクターを使用してはならないルールはたくさんありますが、それをどこで使用しなければならないかについては何もありません。
template<class T>
class move_only : public T{
public:
move_only(){}
move_only(const move_only&) = delete;
move_only(move_only&&) noexcept {};
~move_only() noexcept {};
using T::T;
};
住む
または
template<class T>
struct move_only{
T value;
template<class Arg, class ...Args, typename = std::enable_if_t<
!std::is_same_v<move_only<T>&&, Arg >
&& !std::is_same_v<const move_only<T>&, Arg >
>>
move_only(Arg&& arg, Args&&... args)
:value(std::forward<Arg>(arg), std::forward<Args>(args)...)
{}
move_only(){}
move_only(const move_only&) = delete;
move_only(move_only&& other) noexcept : value(std::move(other.value)) {};
~move_only() noexcept {};
};
ライブコード
あなたのT
クラスは、持っている必要がありますnoexcept
移動コンストラクタ/ assigmentオペレータとnoexcept
デストラクタを。そうしないと、コンパイルエラーが発生します。
std::vector<move_only<MyClass>> vec;