格式化输出的执行顺序
由于 C 语言参数压栈顺序是从右往左,所以 printf 和 cout 函数在执行时是从右往左读入缓冲区,然后从左往右输出。
右值引用和左值引用
C++一共有三种基本值类型: 左值(lvalue), 纯右值(prvalue), 亡值(xvalue);
另外还有两种混合值类型: 泛左值(glvalue),右值(rvalue);
左值(lvalue)简单理解就是可以出现在=的左边,所以是可以被赋值的值;右值(rvalue)类似理解是只可以出现在=的右边,所以是不可以被赋值的值;左值(lvalue) = {泛左值(glvalue)} - {亡值(xvalue)};
右值(rvalue) = {亡值(xvalue)} ∪ {纯右值(prvalue)};
std::move 的作用是返回一个亡值(xvalue);
右值引用是 C++11 中引入的新特性 , 它实现了转移语义和精确传递。它的主要目的有两个方面:
-
消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率。
-
能够更简洁明确地定义泛型函数。
左值和右值的概念:
左值:能对表达式取地址、或具名对象/变量。一般指表达式结束后依然存在的持久对象。右值:不能对表达式取地址,或匿名对象。一般指表达式结束就不再存在的临时对象。
右值引用和左值引用的区别:
-
左值可以寻址,而右值不可以。
-
左值可以被赋值,右值不可以被赋值,可以用来给左值赋值。
-
左值可变,右值不可变(仅对基础类型适用,用户自定义类型右值引用可以通过成员函数改变)。左值引用与右值引用
[c++11]我理解的右值引用、移动语义和完美转发