29

次のステートメントが有用で必要であることを証明するために、特定の状況下での実例を教えていただけますか?

AnyTypeMovable   v;
AnyTypeMovable&& r = move(v);
4

2 に答える 2

14

いいえ、AnyTypeMovable&& r = move(v);ここではまったく役に立ちません。

次のコードを検討してください。

#include <iostream>
#include <vector>

class MyMovableType
{
        int i;
public:
        MyMovableType(int val): i(val){}
        MyMovableType(MyMovableType&& r) { this->i = r.i; r.i = -1; }
        MyMovableType(const MyMovableType& r){ this->i = r.i; }
        int getVal(){ return i; }
};

int main()
{
        std::vector<MyMovableType> vec;
        MyMovableType a(10);
        MyMovableType&& aa = std::move(a);

        vec.push_back(aa);

        std::cout << a.getVal() << std::endl;

        return 0;

}

左辺値と同様に (R. Martinho FernandesXeoaaによって指摘されているように、名前付き右辺値参照は左辺値です)、これは移動が実行されていないことを示します(代入でも呼び出しでも)、したがって、この場合のように、メソッドにそれを追加する必要があります。10push_backstd::movepush_back

#include <iostream>
#include <vector>

class MyMovableType
{
        int i;
public:
        MyMovableType(int val): i(val){}
        MyMovableType(MyMovableType&& r) { this->i = r.i; r.i = -1; }
        MyMovableType(const MyMovableType& r){ this->i = r.i; }
        int getVal(){ return i; }
};

int main()
{
        std::vector<MyMovableType> vec;
        MyMovableType a(10);
        MyMovableType&& aa = std::move(a);

        vec.push_back(std::move(aa));

        std::cout << a.getVal() << std::endl;

        return 0;

}

move が実行されるため、出力は になります-1。したがって、 に渡しaaているという事実にもかかわらず、push_backを介して渡す必要がありますstd::move

于 2013-09-12T14:16:20.173 に答える
1

名前付き右辺値は左辺値であることに注意してください。したがって、std::forward を使用する必要があります。

#include <iostream>
#include <vector>

class MyMovableType
{
        int i;
public:
        MyMovableType(int val)  noexcept   : i(val){}
        MyMovableType(MyMovableType&& r) noexcept { this->i = r.i; r.i = -1; }
        MyMovableType(const MyMovableType& r) noexcept{ this->i = r.i; }
        int getVal()const noexcept{ return i; }
};

int main()
{
        std::vector<MyMovableType> vec;
        MyMovableType a(10);
        MyMovableType&& aa = std::move(a);

        vec.push_back( std::forward<decltype(a)>(aa) );

        std::cout << a.getVal() << std::endl; // -1 printed.

        return 0;

}
于 2013-09-12T16:51:30.713 に答える