C++11 标准库allocator类construct成员函数的用法

使用的场景:
为了使用allocate返回的内存,我们必须用construct构造函数.使用未经构造的内存,其行为是未定义的.

设a为allocator的对象,即allocator a;
则construct的用法为a.construct(p,args)

其中p必须是一个类型为T*的指针,指向一块原始内存;args被传递给类型为T的构造函数,用来在p指向的内存中构造一个对象

在新标准库中,construct成员函数接收一个指针和零个或多个额外参数,在给定位置构造一个元素.额外的参数用来初始化构造的对象.类似于make_shared的参数,这些额外的参数必须是与构造的对象的类型相匹配的合法的初始化器:

allocator<string> alloc;//可以分配string的allocator对象
auto const p = alloc.allocate(n);//分配n个未初始化的string
auto q = p;//q指向最后构造的元素之后的位置
alloc.construct(q++);//*q为空字符串
alloc.construct(q++,10,'c');//*q为cccccccccc
alloc.construct(q++,"hi");//*q为hi!

在早期版本的标准库中,construct只接受两个参数:指向创建对象位置的指针和一个元素类型的值.因此,我们只能将一个元素拷贝到未构造的函数中,而不能用元素类型的任何其他构造函数来构造一个元素.

还未构造对象的情况下就使用原始内存是错误的:

cout<< *p <<endl;//正确:使用string的输出运算符
cout<< *q <<endl;//严重错误:q指向未构造的内存!

后续实际项目中的用法:

alloc.construct(a++,std::move(*b++));

摘自c++ primer,并给予一定的重新排版

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