Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ const_cast对面_C++ - Fatal编程技术网

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()};