- #include
#include
#include
using namespace std;
string getMove()
{
string a = “123456”;
return move(a);
}
void display(int &i)
{
cout << "Lvalue process " << i << endl;
}
void display(int &&i)
{
cout << "Rvalue process " << i<< endl;
}
vector double_vector(vector a)
{
for (auto &r : a)
{
r *= 2;
}
return std::move(a);
}
class MoveTest
{
public:
MoveTest()
{
cout << “create” << endl;
}
MoveTest(MoveTest &)
{
cout << “copy” << endl;
}
MoveTest(MoveTest &&)
{
cout << “move” << endl;
}
};
MoveTest testCopy(MoveTest m)
{
return m;
}
MoveTest testMove(MoveTest m)
{
return std::move(m);
}
int main()
{
string b = getMove();
cout << b << endl;
cout << “-----------------” << endl;
int &&a = 10;
//display(a);
display(a);
display(12);
cout << “-----------------” << endl;
string str = “123456”;
string str1 = std::move(str);
cout << str1 << " " << str.size() << endl;
int aa = 1;
int &&ba = std::move(aa);
cout << ba << " " << aa << endl;
cout << “-----------------” << endl;
vector vecint{1,2,3,4};
vector tt = double_vector(std::move(vecint));
for (auto x : tt)
{
cout << x << " ";
}
cout << endl;
cout << “-----------------” << endl;
MoveTest m1;
MoveTest m2=testCopy(m1);
cout << “*****” << endl;
MoveTest m3 = testCopy(std::move(m1));
system(“pause”);
return 0;
}
执行结果:
使用move之后,我们必须遵循一个承诺:move调用告诉编译器:我们有一个左值,但我们希望像一个右值一样处理它。我们必须 认识到,调用move就意味着承诺:除了对赋值或销毁它外,我们将不再使用它。在调用move之后,我们不能对移后源对象的值做任何假设。C++11的标准类库的说法就是——“仍然有效,但状态不明”
我们在move之后,原来的元素使用的时候要再次初始化或者赋值(当然也看你的移动构造函数怎么实现的)。
右值引用和move语义
最新推荐文章于 2022-07-26 15:37:10 发布