c++ - 与 const_cast 相反
问题描述
我有一个std::vector<int*> v
并且我想阻止进一步写入它。C++ 编译器不接受这个
const std::vector<const int*>& w = v;
但它接受这个
const std::vector<const int*>& w = reinterpret_cast<const std::vector<const int*>&>(v);
后者确实适用于微软的编译器,这意味着int*
内部v
和const int*
内部w
在内存中具有相同的地址。
这是偶然的,作为一种未指定的行为,还是有效的 C++ ?它是否适用于向量内的所有类型,例如std::vector<std::shared_ptr<int>>
?如果无效,还有其他方法可以进行此转换吗?
我知道我也可以复制向量,但我想避免这种情况,因为我的向量很大。
解决方案
这是未定义的行为。
std::vector<const int*>
并且std::vector<int*>
是两个不同的类(由相同的模板生成,但这无关紧要)。他们不能互相别名,你也不能reinterpret_cast
在他们之间。
我的解决方案是使用std::span
:
const std::span s{const_cast<const int* const*>(v.data()), v.size()};
这将创建一个const std::span<const int* const>
.
推荐阅读
- python - “pip install -e .[all]”中的“all”是什么意思?
- javascript - `declare module '*! 是什么意思?
'代表什么? - python - 每次服务器更改时如何更新服务器?
- azure-logic-apps - 天蓝色逻辑应用程序:将数据写入本地 excel 文件
- javascript - 我想在javascript中初始化一个对象数组
- stored-procedures - Azure 数据工厂中的事件处理
- flutter - 允许自定义的 Flutter 条码扫描器
- java - JShell zsh:未知文件属性:5
- wordpress - 如何阻止我的 wordpress 网站中的 doubleclick.net cookie?
- jquery - JQuery 列表项fadeIn 和fadeOut