Could you guys give me an illustrative example under certain circumstance to prove the following statements are useful and necessary?
AnyTypeMovable v;
AnyTypeMovable&& r = move(v);
Could you guys give me an illustrative example under certain circumstance to prove the following statements are useful and necessary?
AnyTypeMovable v;
AnyTypeMovable&& r = move(v);
No, AnyTypeMovable&& r = move(v);
here is not useful at all.
Consider the following code:
#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
is an l-value (as noted by R. Martinho Fernandes, and also by Xeo - a named rvalue-reference is an lvalue), this will print 10
indicating that moving has not been performed (nor in the assignment, nor in the push_back
call), so you still need to std::move
it to the push_back
method, as in this case:
#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 will be performed, so the printout will be -1
. So, despite the fact that you're passing aa
to the push_back
, you still need to pass it via std::move
.
std::string&&
is just the same as std::string&
? Is this how the standart defines it? –
Barden std::string
doesn't require the original string to be left in any particular state. It only has to be valid, and it's perfectly fine for it to have the same original value. –
Bacchant Note that, Named rvalue is lvalue. So you should use 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;
}
© 2022 - 2024 — McMap. All rights reserved.
r
is now an lvalue (it has a name!), and you needstd::move(r)
anyway to make it an rvalue. – Bacchantv
doesn't need to be movable. – Nyssastd::move
is called anyway – Dwyer