gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 23:56:51 24 4
gpt4 key购买 nike

我尝试编写一个“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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com