私が(些細な)クラスを持っているとしましょう。これは、移動構築可能で移動割り当て可能ですが、コピー構築可能またはコピー割り当て可能ではありません。
class movable
{
public:
explicit movable(int) {}
movable(movable&&) {}
movable& operator=(movable&&) { return *this; }
movable(const movable&) = delete;
movable& operator=(const movable&) = delete;
};
これは正常に機能します。
movable m1(movable(17));
もちろん、これはm1
右辺値ではないため、機能しません。
movable m2(m1);
しかし、それを右辺値参照にキャストするでラップm1
して、それを機能させることができます:std::move
movable m2(std::move(m1));
ここまでは順調ですね。ここで、単一の値を保持する(同様に些細な)コンテナクラスがあるとします。
template <typename T>
class container
{
public:
explicit container(T&& value) : value_(value) {}
private:
T value_;
};
ただし、これは機能しません。
container<movable> c(movable(17));
コンパイラ(私はclang4.0とg++ 4.7.2を試しました)は、の初期化リストmovable
での削除されたコピーコンストラクタを使用しようとしていると文句を言いcontainer
ます。繰り返しますが、ラップvalue
インstd::move
すると機能します。
explicit container(T&& value) : value_(std::move(value)) {}
しかし、なぜstd::move
この場合に必要なのですか?value
まだタイプではありませんmovable&&
か?とどうvalue_(value)
違うのmovable m1(movable(42))
?