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());
Run Code Online (Sandbox Code Playgroud)
最后一行是如何工作的?我在关于如何创建一个istringstream而不复制的多个 SO 答案中看到了它。
如果我理解正确,data则是对其键为"my_key"的映射元素的常量引用。并且由于也at()通过 const 引用返回,因此不会复制向量的值。但是因为它是一个常量引用,所以我不能改变向量的元素。
data()返回 a const unsigned char*,我将其转换为char*. 这是否意味着现在可以更改数组的元素?(因为它是一个指向非常量类型的指针)。还是在我投射时向量被复制了?
这是否意味着现在可以更改数组的元素?
这意味着指针的类型是这样的,通过指针修改对象是良构的。这意味着编译器不需要向您提供诊断消息,并且假设整个程序格式良好,则编译器必须不会编译失败(适用一些限制)。
然而,如果指向的对象是一个 const 对象,那么通过指向非常量的指针修改它的行为将是 undefin。
但是在这种情况下的向量元素是非常量的(因为模板类型参数是非常量的),因此将定义修改它们。不过,这可能会让程序的读者感到惊讶。另一个问题是是否std::istringstream曾经修改过指向的对象。
| 归档时间: |
|
| 查看次数: |
215 次 |
| 最近记录: |