C++ 将常量指针强制转换为非常量 extern const map my_map; //获取常量引用,不复制 const vector&data=my_map.at(“my_key”); //也没有副本? istringstream; iss.rdbuf()->pubstebuf((char*)data.data(),data.size());

C++ 将常量指针强制转换为非常量 extern const map my_map; //获取常量引用,不复制 const vector&data=my_map.at(“my_key”); //也没有副本? istringstream; iss.rdbuf()->pubstebuf((char*)data.data(),data.size());,c++,C++,最后一行是如何工作的?我在多个SO上看到了关于如何创建istringstream而无需复制的答案 如果我理解正确,data是对映射元素的常量引用,其键为“my_key”。而且由于at()也通过常量引用返回,因此没有复制向量的值。但是因为它是常量引用,所以我不能改变向量的元素 data()返回一个const unsigned char*,我将其转换为char*。这是否意味着现在可以更改数组的元素?(因为它是指向非常量类型的指针)。还是在我施法的时候被复制了 这是否意味着现在可以更改数组的元素 这意

最后一行是如何工作的?我在多个SO上看到了关于如何创建
istringstream
而无需复制的答案

如果我理解正确,
data
是对映射元素的常量引用,其键为“my_key”。而且由于
at()
也通过常量引用返回,因此没有复制向量的值。但是因为它是常量引用,所以我不能改变向量的元素

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

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

这意味着指针的类型可以通过指针修改对象。这意味着编译器不需要向您提供诊断消息,并且假设整个程序格式良好,编译器不需要编译失败(某些限制适用)

但是,如果指向的对象是常量对象,则通过指向非常量的指针修改它的行为将是未定义的


但是本例中的向量元素是非常量的(因为模板类型参数是非常量的),因此需要定义对它们的修改。不过,这可能会让该节目的读者感到惊讶。另一个问题是
std::istringstream
是否曾经修改过指向的对象。

是(或将导致)未定义的行为。@richardcriten仅当您写入那些
char
s时,这
std::istringstream
在丢弃
const
时可能不会非常小心。我宁愿永远不做。如果您从中强制转换的
const
对象最初声明为
const
,则如果您修改该对象,则代码具有未定义的行为。丢弃
const
仅当所讨论的对象最初声明为非const时才有效-这可能非常难以确定(即使您知道这仍然是一件非常可疑的事情)。“这是否意味着现在可以更改数组的元素?”-不安全,否。
map
的内容是常量,可能是只读的,丢弃常量不会改变这一点。另外,正确的C++样式转换应该是
const\u cast(reinterpret\u cast(data.data())
,而不是C样式转换
(char*)data.data()
“或者向量在我转换它时被复制了吗?”-不,它没有被复制。@Tirafesi“实现”是你的编译器+它的朋友/相关工具(包括标准库)。这意味着“C++标准的实现”。关于实现定义的行为:但是向量是一个常数对象。"?我不清楚。@LightnessRaceswithMonica嗯,这是一个很好的观点。或者更确切地说,是向量常量的缓冲区。它是一个非常量的向量,所以…我想不是。有趣的是,是的。我也不相信向量是常量,即使它是常量,我也不相信它的缓冲区是常量!如果这两个东西都不是常量,那么
const_《随心所欲》虽然不明智,但并非非法或未定义。@LightnessRaceswithMonica修改了答案。说清楚了,这是我的猜测。我不清楚,我没有提出要求!最近有一场关于这一点的辩论,从未解决过。
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());