模板的使用(续)(左值右值)

C++中decltype与C中的typeof相似

模板是C++重载的高级展现形式


左值右值及左值引用右值引用

值:1、左值        2、右值

引用:1、左值引用         2、右值引用

当一个值为左值时,它优先绑定左值引用

当一个值为右值时,它优先绑定右值引用

左值:表常态,到了下一行,单一变量还能访问到。

右值:表临时,到了下一行,单一变量不能访问到。

左值引用,奇数个&。

右值引用,偶数个&。

模板的使用(续)(左值右值)_第1张图片

左值右值的区分是为了分多种情况进行处理。


move()函数:将任何表达式变成右值。

      模板的使用(续)(左值右值)_第2张图片 

模板的使用(续)(左值右值)_第3张图片

forward(x):将x调整成int &&(右值)类型。 

模板的使用(续)(左值右值)_第4张图片

 模板的使用(续)(左值右值)_第5张图片

当没有move()和forward()的状况如下:

模板的使用(续)(左值右值)_第6张图片

模板的使用(续)(左值右值)_第7张图片

 模板的使用(续)(左值右值)_第8张图片

 函数希望返回左值->返回引用

 函数希望返回右值->返回值


移动构造:是左值右值做区分所构成的产物,将一个对象直接全部给另一个对象,并销毁(师傅归西,把内力全部传给徒弟)

例:

        Array(Array &&A) : __size(a.__size), data(a.data){

                a.data = nullptr;

                a.__size = 0;

                return 0;

        }

移动构造的优势:

1、深拷贝是O(n)的操作,移动构造是O(1)的操作。


模板的特化:

1、类模板(特化【全特化】,偏特化)

2、函数模板(特化)

3、函数模板没有偏特化,模板类有偏特化

特化优先级顺序:1、全特化        2、偏特化        3、无特化

模板的使用(续)(左值右值)_第9张图片

模板的使用(续)(左值右值)_第10张图片

模板的使用(续)(左值右值)_第11张图片

 第一个为无特化,第二个为全特化,第三个为偏特化。

你可能感兴趣的:(c++)