拥有动态对象的 std::数组是否安全

Is it safe to have a std::array of dynamic object?

本文关键字:数组 安全 是否 std 动态 对象 拥有      更新时间:2023-10-16

具有动态对象的std::array(例如std::array<std::string, 3>)并调整内容(字符串)的大小是否安全?(因为拥有原始 C 字符串数组可能会有问题)

是的,因为std::array只是一个友好的模板,它包装了一个底层的 C 样式 aray 数组。你可以把它想象成这样:

template <typename T, int size>
class Array {
...
   T vals[size];
}

将上面的 T 更改为字符串,您将很快意识到,您可以对字符串数组的内容执行的任何操作都可以使用std::array字符串执行。这包括调整大小,删除,任何你能想象到的。

要更深入地思考它,请以这种方式思考。std::array包含一根字符串。字符串不知道它被固定在哪里。当数组本身被赋值时,数组可能会告诉字符串创建自身的副本(通过复制构造函数或赋值)。但是,这完全是通过字符串的公共接口实现的。字符串被任何数据结构保存的事实并不限制该字符串的功能,它只是使持有者(在本例中为std::array)成为string公共接口的另一个客户端。

由于像std::array这样的容器需要使用各种各样的类型,因此它们往往对传入的类型T做出相对较少的典型有据可查的假设。诸如要求 T 可以复制构造、默认构造和分配之类的东西。然后,通常由T的实施者*来确保这几个假设是有效的。

*有一个非常高级的主题称为模板专用化,其中可以编写一个专门版本的数组,例如"字符串"。除此之外vector<bool>这些在标准容器中非常罕见。

假设你的意思是调整字符串的大小,那么是的。