1

表达式new T[n] 可能会或可能不会初始化数组中的每个对象,具体取决于是什么T

如何使用 复制此初始化行为allocator

struct Foo
{
    int x;
    Foo() : x(1)
        { }
};

Foo *p = new Foo[1];
assert(p[0].x == 1);
4

1 回答 1

3

在 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 具有适用于大多数实现的那种东西。

我认为你在这里与设计作斗争。分配器接口是为容器设计的。容器被设计为不包含未初始化的元素,因此它们没有用于默认初始化。

于 2012-07-24T08:28:04.997 回答