Не могли бы вы, ребята, дать мне иллюстративный пример при определенных обстоятельствах, чтобы доказать, что следующие утверждения полезны и необходимы?
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;
}
As aa
является l-значением (как отмечено R. Martinho Fernandes, а также Xeo - названная rvalue-reference является значением lvalue), это приведет к печати 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;
}
будет выполнено перемещение, поэтому распечатка будет -1
. Поэтому, несмотря на то, что вы передаете aa
в push_back
, вам все равно нужно передать его через std::move
.
Обратите внимание, что Named rvalue имеет значение lvalue. Поэтому вы должны использовать 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;
}