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>
格式错误。
以下无法编译(非常详细的错误,但基本上是 "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>
格式错误。