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

标签 c++ arrays constructor

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

相关文章:

c++ - 在 C++ 函数中分配大型本地内存的最佳方法

c++ - 在 C++ 类中声明数组数据

具有私有(private)初始化的 C++ 构造函数

c++ - unordered_map 的存在决定了是使用复制构造函数还是 move 构造函数

c++ - 隐式创建的默认构造函数是否负责分配对象内存?

c++ - 在 Ubuntu 上找不到 TCP_NODELAY

arrays - 以特定大小拆分数组

arrays - 求数组中最大 X 个数字的总和

java - 在 Java 中从 "2d array"检索值时出现问题

c++ - g++如何不报告给定代码的错误?