没有初始化的C ++数组成员

时间:2014-11-10 12:30:36

标签: c++ arrays constructor

我试着写一个"内联向量"用于在堆栈上方便地存储多个元素的类:

template<typename T, size_t size_ = 256>
struct InlineVector{
    T content[size_];
    size_t num;

    T() : num(0) {}

    ~T() { for(size_t s = 0; s < num; s++){ content[s]->~T(); } }

    template<typename _Up, typename... _Args>
    void emplace_back(_Args&&... __args) { new (&content[num++]) T(__args); }

    T& get(size_t i) { assert(i < num); return content[i]; }


}

出于效率原因,我希望content的{​​{1}}未在X的构造函数中初始化,即使T只有一个非平凡的构造函数。如您所见,内容将在以后实际插入,并在实际插入时添加新内容。但是,C ++似乎强制要求content的所有元素必须在X的初始化中初始化。例如,这不编译:

struct Y{ Y(int){} }

X<Y> foo; // compile error, no constructor for Y is called in the construction of X

那么,即使数组元素类型需要构造函数,如何使一个未初始化的数组成员成为可能呢?

2 个答案:

答案 0 :(得分:6)

通过使数组成为char s和稍后放置new的数组。 char是唯一允许您执行此操作的类型。

当你在它的时候,你也可以编写自己的 allocator (将数组作为其成员之一),并将其插入std::vector而不是重新发明整个社会。

std::vector<int, YourAllocatorType<int, 256>> v;

答案 1 :(得分:1)

  

那么,即使数组元素类型需要构造函数,如何使一个未初始化的数组成员成为可能呢?

不适用于T x[n] ...但您可以将任何旧T*指向正确对齐的未初始化内存,然后管理您自己的临时构造和销毁。您还可以探索使用您的类型创建union并说出char,并拥有一系列工会....