右值以及移动函数
如果称 &i = a; i是左值运算; 那&&i = a为右值运算;
**当然为右值运算右边的值应该为一个常数; **
正是新定义的右值运算, 也就有了移动函数;
#include <iostream>
#include <cstdlib>
#include <string>
#include <utility>
#include <vector>
//移动拷贝;
//移后源对象必须可析构;
class T1
{
public:
T1() = default;
~T1() = default;
T1(const T1 &) = default;
//赋值运算符既是移动运算符, 也是拷贝赋值运算符;
T1 & operator = (T1 t1) { std::swap(*this, t1); return *this; }
//noexcept : 保证程序的移动函数是绝对正确 没有异常的;
T1(T1 &&t1) noexcept : x(t1.x), str(t1.str) {}
//引用限定符;
T1 & operator = (const T1 &) &; //只能向可修改的左值赋值
//T1 Fun() & const; 只能将 & 放在const之后;
T1 Fun() const &; //可用于任何类型的T1;
T1 Fun1() && ; //只能用于可改变的右值;
private:
int x;
std::string str;
};
//T1::T1(T1 &&t1) noexcept
//{
// x = t1.x;
// str = t1.str;
//}
int main()
{
//右值引用;
//右边的值是非变量, 而且这样右侧的值即将被销毁; 右侧的只能用于销毁和赋值操作;
int i = 0;
int &x1 = i;
int &&x2 = 1;
int &&x3 = i * i;
int &&x4 = std::move(x3);
x3 = 32; //当x3改变时, x4也会改变
std::cout << x3 << " " << x4;
system("pause");
return 0;
}
当然, 自己看右值的时候已经很蒙了, 还是等很久再来重温它应该会理解更深刻;