const 指针的向量?

vector of const pointers?

以下无法编译(非常详细的错误,但基本上是 "cannot be overloaded" 和 "invalid conversion from 'const void*' to 'void*'")。我能理解为什么例如 push_back() 可能无法编译,因为您不能将 copy/move 转换为 Foo* const,但为什么不能编译:

#include <vector>
using namespace std;

class Foo;

int main()
{
  vector<Foo* const> vec;
}

矢量可能是唯一要求元素为 copy assignable 的容器。这是因为保证元素在内存中连续存储。因此,如果超出容量,则必须分配一个新块并重新分配元素。您不能对 const 个元素执行此操作。

如果您尝试 std::vector<const int> 或实际上任何 const 类型,都会出现同样的错误。

您正在声明一个包含 const Foo 指针的向量,这意味着无法修改该指针。当您在向量中插入一个元素时,需要写入 const pointer(无效)。

你确定不是:std::vector<Foo const *> vec; 其中 Foo 不能被指针修改。

C/C++ const 关键字是左关联的,即它影响其左侧的标记,除非 const 是语句中的第一个标记。所以 void *const 表示 "constant (=immutable) pointer to void".

因此语义是:

int a;
void * const ptr = (void*)&a; /* legal */

int b;
ptr = (void*)&b; /* not permitted */

后者是非法的,因为 const 变量必须在定义时初始化,以后不能更改。

在编写 std::vector<void * const> 时,您要求编译器将模板实例化为指向 void 的不可变指针的向量。无论如何不可变意味着,它只能在定义时分配给它,但是它不符合 std::vector.

的动态特性

向量元素需要为许多操作赋值:如果你在向量中间插入一个元素,后面的所有元素都必须重新赋值。 Const 限定类型通常不可赋值。

如果您不执行需要赋值的操作,您仍然可以使用不可赋值类型的向量。

但是,当 T 是非常量对象类型时,您只能使用 std::allocator<T>,因此 std::vector<const int> 格式错误。