将const指针转换为非const

时间:2019-12-09 16:21:31

标签: c++

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” 的地图元素的const引用。并且由于at()也通过const引用返回,因此未复制向量的值。但是,由于它是一个const引用,所以我不能更改向量的元素。

data()返回一个const unsigned char*,我将其强制转换为char*。这是否意味着现在可以更改数组的元素了? (因为它是指向非const类型的指针)。还是我投射时复制了载体?

1 个答案:

答案 0 :(得分:6)

  

这是否意味着现在可以更改数组的元素了?

这意味着指针的类型应使其格式正确,可以通过指针修改对象。这意味着不需要编译器向您提供诊断消息,并且假设整个程序格式正确,则要求编译器不使编译失败(有一些限制)。

但是,如果指向的对象是const对象,则无法通过指针指向非const对其进行修改。

但是在这种情况下,矢量元素是非常量的(因为模板类型参数是非常量的),因此可以定义它们。但是对于程序的读者来说可能是令人惊讶的。另一件事是std::istringstream是否曾经修改过指向对象。

相关问题