常量指针的向量?

时间:2015-03-31 21:03:41

标签: c++ pointers vector const

以下不编译(非常详细的错误,但基本上“不能重载”和“从'const void *'无效转换为'void *'”)。我可以理解为什么例如push_back()可能无法编译,因为你无法复制/移动到Foo* const,但为什么不编译:

#include <vector>
using namespace std;

class Foo;

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

4 个答案:

答案 0 :(得分:11)

向量可能是唯一需要元素为copy assignable的容器。这是因为保证元素在存储器中连续存储。因此,如果超出容量,则必须分配新块并重新分配元素。您无法使用const元素执行此操作。

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

C / C ++ const关键字是左关联的,即它会影响其左侧的标记,除非const是语句中的第一个标记。所以void *const表示&#34;常量(=不可变)指向void&#34;。

因此语义是:

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

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

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

编写std::vector<void * const>时,您要求编译器将模板实例化为void的不可变指针向量。但是,不可变的意思是,它只能在定义时分配,但不会与std::vector的动态特性一起使用。