C++ const_cast对面
我有一个C++ const_cast对面,c++,C++,我有一个std::vector v,我想阻止进一步写入它。C++编译器不接受这个< /P> const std::vector<const int*>& w = v; const std::vector&w=v; 但它接受这一点 const std::vector<const int*>& w = reinterpret_cast<const std::vector<const int*>&>(v); const st
std::vector v
,我想阻止进一步写入它。C++编译器不接受这个< /P>
const std::vector<const int*>& w = v;
const std::vector&w=v;
但它接受这一点
const std::vector<const int*>& w = reinterpret_cast<const std::vector<const int*>&>(v);
const std::vector&w=重新解释(v);
后者确实与Microsoft的编译器配合使用,这意味着int*
内部v
和const int*
内部w
在内存中具有相同的地址
这是偶然的,作为一种未指定的行为,还是有效的C++?它是否适用于向量内部的所有类型,如
std::vector
?如果无效,是否有其他方法进行此转换
我知道我也可以复制向量,但我想避免,因为我的向量非常大。这是未定义的行为
std::vector
和std::vector
是两个不同的类(由同一个模板生成,但不相关)。它们不能互相别名,也不能在它们之间重新解释转换
我的解决方案是使用:
const std::span s{const_cast(v.data()),v.size();
这将创建一个
const std::span
如何将向量声明为const:const std::vector v
?@vahancho问题在于常量int*
,而不是常量向量
。您的重新解释的类型是UB。可能会有帮助。这当然是一个优雅的解决方案。不过,const_cast的让它有点难看。如果我们能摆脱它就更好了。@AyxanHaqverdili是的,有一种更好的解决方案:修改原始变量类型。因为OP不可能做到这一点,我觉得这是下一个最好的选择。const_cast
对我来说不是问题,因为它用于添加const,而不是删除它。我无法更改变量的类型,因为向量在算法中的某一点上确实被修改过,然后变成只读,并用作算法其余部分的输入。我在C++14中,所以我不能使用span,但是将常量getter暴露到向量的开头和结尾就足够了。谢谢。@bolov请注意,这样添加常量是危险的。看见否则,这种转变会是含蓄的。@Artyer哦,哇,我错了。谢谢你指出这一点。编辑。
const std::span s{const_cast<const int* const*>(v.data()), v.size()};