表达式new T[n]
可能会或可能不会初始化数组中的每个对象,具体取决于T
是什么。
如何使用allocator
?
struct Foo
{
int x;
Foo() : x(1)
{ }
};
Foo *p = new Foo[1];
assert(p[0].x == 1);
答案 0 :(得分:3)
在C ++ 03中,allocator接口只知道一种初始化对象的方法,那就是从另一个对象复制。 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
测试可能是错误的。检查标准,确切地说默认初始化什么都不做。显然{C> 03中不存在is_pod
,但我模糊地回忆起Boost有一些适用于大多数实现的东西。
我认为你在这里与设计作斗争。分配器接口设计用于容器。容器的设计不包含未初始化的元素,因此它们不能用于默认初始化。