为什么vector<int * const>是非法/不合逻辑的?

Why is vector<int * const> illegal/illogical?

本文关键字:非法 不合逻辑 const lt vector int 为什么 gt      更新时间:2023-10-16

我是C++ :)新手我只是想创建一个指向非常量整数的常量指针向量。因此,我想,我将有一个指针向量,我可能不会更改其地址。

我写道:

std::vector<int * const> pointers;

但无法编译它(使用 GCC)。

我收到 5 个错误,从:"初始化'无效运算符删除(void*)'的参数 1"和"从'常量无效*'到'无效*'的转换无效"

为什么这是非法的(或不合逻辑的),它与无效指针有什么关系?

简而言之,vector 需要其模板参数来支持一些基本操作,其中之一就是项目分配。

vector有几个需要分配给其项目的操作。例如,每当vector空间不足并需要重新调整大小时,它都会分配一个新的内存块,然后将其信息复制到新块。如果项目类型为 const ,则无法分配给新的内存块。

无论如何,将参数声明为const并没有多大意义。你试图得到什么行为?

我认为错误的简洁理由如下:向量是一种可变的数据结构,因此您可以更改向量的内容(例如通过使用push_backerase)。当您实例化矢量模板时,您实例化的代码将尝试覆盖矢量的内容,这是您的int *const声明所禁止的。

如果你想要一个不能变异的向量,那么你可以使用对向量的常量引用,或者创建一个 const 向量并按值传递它。