如果称 &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; }当然, 自己看右值的时候已经很蒙了, 还是等很久再来重温它应该会理解更深刻;