以下不编译(非常详细的错误,但基本上“不能重载”和“从'const void *'无效转换为'void *'”)。我可以理解为什么例如push_back()可能无法编译,因为你无法复制/移动到Foo* const
,但为什么不编译:
#include <vector>
using namespace std;
class Foo;
int main()
{
vector<Foo* const> vec;
}
答案 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
的动态特性一起使用。