我尝试编写一个“inline-vector”类来方便地在堆栈上存储一些元素:
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
不在 X
的构造函数中初始化,即使 T
只有一个非平凡的构造函数。如您所见,内容稍后会在实际插入时使用 placement new 进行初始化。但是,C++ 似乎强制要求 content
的所有元素必须在 X
的初始化中进行初始化。例如,这不会编译:
struct Y{ Y(int){} }
X<Y> foo; // compile error, no constructor for Y is called in the construction of X
那么,即使数组元素类型需要构造函数,怎么可能有一个未初始化的数组成员呢?
最佳答案
通过使数组成为 char
数组,然后将 new
放入其中。 char
是您唯一可以使用的类型。
当你这样做的时候,你不妨编写自己的 allocator(将数组作为其成员之一),并将其插入 std::vector
而不是重新发明整个 shebang。
std::vector<int, YourAllocatorType<int, 256>> v;
关于没有初始化的 C++ 数组成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26843889/