将 T* 的容器转换为 const T* 的容器实际上安全吗?
Is it practically safe to cast container of T* to container of const T*?
例如,
std::vector<SomeNonCopyableType*> values = getVector();
auto &cvalues = reinterpret_cast<std::vector<const SomeNonCopyableType*>&>(values);
// use cvalues...
当然这在标准中是不允许的。
但是,除非专门化,否则指向类型的常量性不会对实现细节产生任何影响。在这种情况下,我可以认为这种转换实际上是安全的吗?
如果这是个坏主意,有没有优雅的方法可以在不复制的情况下从指向非常量的指针的容器创建指向 const 的指针的容器?
实际上是的,但这不是你应该做的。不要给容器取别名,而是使用它的 const_iterator
类型来处理容器中包含的元素范围。 (如果你愿意,你可以使用实验性的 std::experimental::ranges::Range
结构来帮助解决这个问题。)
例如,
std::vector<SomeNonCopyableType*> values = getVector();
auto &cvalues = reinterpret_cast<std::vector<const SomeNonCopyableType*>&>(values);
// use cvalues...
当然这在标准中是不允许的。 但是,除非专门化,否则指向类型的常量性不会对实现细节产生任何影响。在这种情况下,我可以认为这种转换实际上是安全的吗?
如果这是个坏主意,有没有优雅的方法可以在不复制的情况下从指向非常量的指针的容器创建指向 const 的指针的容器?
实际上是的,但这不是你应该做的。不要给容器取别名,而是使用它的 const_iterator
类型来处理容器中包含的元素范围。 (如果你愿意,你可以使用实验性的 std::experimental::ranges::Range
结构来帮助解决这个问题。)