SGI-STL简记(三)-构造、类型萃取特性、未初始化解析

stl_construct.h :
    提供多种构造器、销毁器模板函数;
    构造器construct提供了给定值构造和默认构造方式,通过调用重载函数_Construct实现;
    销毁器destroy提供了销毁指针和迭代器的方式,通过调用重载函数_Destroy实现;
    _Construct:通过“放置”new,构造实现;
    _Destroy:通过调用模板类型对象析构函数实现,对于迭代器器方式,则通过__destroy(内部通过__destroy_aux)遍历销毁,因内置数据类型不需要销毁,
    故内部需要判断是否为内置类型,对非内置类型则调用对应类型的析构函数即可,否则不处理;
    __destroy_aux:重载的模板类,通过__false_type或__true_type确定是否为可隐式销毁的对象;
    此外_Destroy因普通内置类型的指针也可作为迭代器,故又重载了各个基本类型的处理(不处理);

type_traits.h :
    类型萃取、特性;
    两个特殊类型__true_type、__false_type,一般作为某些模板参数的识别的标识,如上面的__destroy_aux;
    __type_traits:类型特性萃取模板类,其中has_trivial_default_constructor、has_trivial_copy_constructor、has_trivial_assignment_operator、
    has_trivial_destructor、is_POD_type分别表示为隐式默认构造、拷贝构造、赋值操作、隐式析构、是否为原内置类型,默认情况下均为__false_type;
    其他的__type_traits特化版本均为内置类型(如:int,bool,float,...,char *等)均为__true_type,
    _Is_integer:模板函数,是否为整型(或可转化为整型的类型(如:int, unsigned char, short, long long ...)),其中_Integral在其他情况默认为__false_type;
    当为整型类型时,为__true_type;
    
    此外还有各个组件中基本上都会用到的类型重声明:
        typedef size_t     size_type;
        typedef ptrdiff_t  difference_type;
        typedef _Tp*       pointer;
        typedef const _Tp* const_pointer;
        typedef _Tp&       reference;
        typedef const _Tp& const_reference;
        typedef _Tp        value_type;
        
stl_uninitialized.h :
    初始化填充、拷贝:
    uninitialized_copy:目前提供3个重载版本,其中两个分别对char*、wchar_t*数据类型直接调用memmove内存拷贝,另一个提供迭代器范围拷贝,其通过
    __uninitialized_copy处理,内部获取结果前向迭代器的内容指针类型并再次调用__uninitialized_copy_aux;__uninitialized_copy_aux内部通过萃取
    内容指针类型是否为is_POD_type,实现分别处理不同的内容,若为原始POD则内部直接调用copy即可,否则遍历迭代器并分别调用_Construct构造,若失败
    抛出了异常则调用_Destroy析构之前已成功构造的对象,此外根据迭代器不同,有不同的迭代策略;
    uninitialized_copy_n:同uninitialized_copy,提供了拷贝个数的参数;
    uninitialized_fill、uninitialized_fill_n:类型于uninitialized_copy与uninitialized_copy_n;原始POD类型通过fill填充,否则遍历迭代调用_Construct构造,
    若失败抛出了异常则调用_Destroy析构之前已成功构造的对象,此外根据迭代器不同,有不同的迭代策略;
    
原文地址:https://www.cnblogs.com/haomiao/p/11647208.html