将常量指针强制转换为非常量
Casting const pointer to non const
extern const map<string, vector<unsigned char>> my_map;
// get const reference, no copying
const vector<unsigned char> &data = my_map.at("my_key");
// also no copy?
istringstream iss;
iss.rdbuf()->pubsetbuf((char *)data.data(), data.size());
最后一行如何工作?我在多个关于如何在不复制的情况下创建istringstream
的 SO 答案上看到了它。
如果我理解正确,data
是对键为"my_key">的地图元素的常量引用。由于at()
也通过常量引用返回,因此不会复制向量的值。但是由于它是一个常量引用,那么我无法更改向量的元素。
data()
返回一个const unsigned char*
,我将其投射到char*
。这是否意味着现在可以更改数组的元素?(因为它是指向非 const 类型的指针(。还是在我铸造时复制了矢量?
这是否意味着现在可以更改数组的元素?
这意味着指针的类型是这样,它的格式正确,可以通过指针修改对象。这意味着编译器不需要为您提供诊断消息,并且假设整个程序的格式正确,则编译器需要不使编译失败(存在某些限制(。
但是,如果指向的对象是 const 对象,那么通过指向非 const 的指针修改它的行为将是不可发现的。
但是在这种情况下,向量元素是非常量元素(因为模板类型参数是非常量(,因此将定义修改它们。不过,对于该程序的读者来说,这可能会令人惊讶。另一个问题是std::istringstream
是否修改过尖锐的对象。
相关文章:
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 什么时候在C++中返回常量引用是个好主意
- 代理对象的常量正确性
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 通过多个头文件使用常量变量
- 在cuda线程之间共享大量常量数据
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 是默认情况下分配给char数组常量的值
- 私有类型的静态常量成员
- OpenGL大的3D纹理(>2GB)非常慢
- 类似枚举的计算常量
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 使用常量键但非常量值进行映射
- 为什么`is_open()`非常常量
- 从getter方法返回常量和非常量值
- 阻止const类函数在引用成员上调用非常常量类函数
- C++初始化非常大的常量数组,最佳实践
- 提高c++中非常大的常量的可读性