将常量指针强制转换为非常量

Casting const pointer to non const

本文关键字:常量 非常 转换 指针      更新时间:2023-10-16
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是否修改过尖锐的对象。