表达式new T[n]
可能会或可能不会初始化数组中的每个对象,具体取决于是什么T
。
如何使用 复制此初始化行为allocator
?
struct Foo
{
int x;
Foo() : x(1)
{ }
};
Foo *p = new Foo[1];
assert(p[0].x == 1);
表达式new T[n]
可能会或可能不会初始化数组中的每个对象,具体取决于是什么T
。
如何使用 复制此初始化行为allocator
?
struct Foo
{
int x;
Foo() : x(1)
{ }
};
Foo *p = new Foo[1];
assert(p[0].x == 1);
在 C++03 中,分配器接口只知道一种初始化对象的方法,那就是从另一个对象复制。C++11 有更多。
您要求进行默认初始化,这意味着(大约)“要么什么都不做,要么调用默认构造函数”。分配器接口在 C++03 中不能做后者。
我想你可以写这样的东西:
T *ra = allocator.allocate(1);
if (!is_pod<T>::value) {
// in C++03
allocator.construct(ra, T());
// in C++11
allocator.construct(ra);
}
不过,那个is_pod
测试可能是错误的。检查标准以了解默认初始化什么都不做的条件。显然is_pod
在 C++03 中不存在,但我隐约记得 Boost 具有适用于大多数实现的那种东西。
我认为你在这里与设计作斗争。分配器接口是为容器设计的。容器被设计为不包含未初始化的元素,因此它们没有用于默认初始化。