次のステートメントが有用で必要であることを証明するために、特定の状況下での実例を教えていただけますか?
AnyTypeMovable v;
AnyTypeMovable&& r = move(v);
次のステートメントが有用で必要であることを証明するために、特定の状況下での実例を教えていただけますか?
AnyTypeMovable v;
AnyTypeMovable&& r = move(v);
いいえ、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 FernandesとXeoaa
によって指摘されているように、名前付き右辺値参照は左辺値です)、これは移動が実行されていないことを示します(代入でも呼び出しでも)、したがって、この場合のように、メソッドにそれを追加する必要があります。10
push_back
std::move
push_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
。
名前付き右辺値は左辺値であることに注意してください。したがって、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;
}