在容器类型中转换指向const的指针

emk*_*y08 5 c++ containers pointers casting const

C++从提供隐式转换T *const T *.

如果我T *现在在容器类中使用,比如in vector<T *>,那么当然没有隐式转换vector<const T *>.

使用reinterpret_cast似乎可以投射整个容器,但实际上这样做是否安全?

template <typename T>
const vector<const T *> & constVector(const vector<T *> & vec) {
    return reinterpret_cast<const vector<const T *> &>(vec);
}

// Usage:
vector<int *> vec1;
vector<const int *> vec2 = constVector(vec1);
Run Code Online (Sandbox Code Playgroud)

Vit*_*meo 9

但实际上这样做是否安全?

不,这是未定义的行为.reinterpret_cast在非常有限的场景中使用它是安全的,请参考cppreference.


如果不关心所有权,您可能希望在非范围的对象上使用(或实现)const 视图const.谷歌搜索span将是一个良好的开端.std::string_view就是这样的一个例子std::string.

  • 请记住,因为vector是一个类模板,vector <T*>和vector <T const*>可以(理论上)具有完全不同的表示. (4认同)
  • 依赖于某些工作实践是危险的,因为将来对编译器或标准库的更改可能会改变代码的行为. (2认同)