与 const_cast 相反

V. *_*ria 3 c++

我有一个std::vector<int*> v,我想防止进一步写入它。C++ 编译器不接受这个

const std::vector<const int*>& w = v;
Run Code Online (Sandbox Code Playgroud)

但它接受这一点

const std::vector<const int*>& w = reinterpret_cast<const std::vector<const int*>&>(v);
Run Code Online (Sandbox Code Playgroud)

后者确实适用于 Microsoft 的编译器,这意味着int*内部vconst int*内部w在内存中具有相同的地址。

这是偶然的,作为一种未指定的行为,还是有效的 C++ ?它是否适用于向量中的所有类型,例如std::vector<std::shared_ptr<int>>?如果无效,是否有另一种方法可以执行此转换?

我知道我也可以复制向量,但我想避免这种情况,因为我的向量非常大。

bol*_*lov 8

这是未定义的行为。

std::vector<const int*>并且std::vector<int*>是两个不同的类(由相同的模板生成,但这无关紧要)。他们不能互相别名,你不能reinterpret_cast在他们之间。

我的解决方案是使用std::span

const std::span s{const_cast<const int* const*>(v.data()), v.size()};
Run Code Online (Sandbox Code Playgroud)

这将创建一个const std::span<const int* const>.