【问题标题】:const correctness for containers容器的 const 正确性
【发布时间】:2016-04-09 22:02:01
【问题描述】:

在多年盲目接受std::vector<T>::operator[] const 返回const_reference 的事实之后,但是,鉴于 const 对智能指针的作用,我现在开始怀疑为什么它和其他 STL 容器被设计成这样大大地。 const std::vector 的“常量”似乎同时应用于向量及其元素,而对于智能指针,“常量”仅适用于指针而不是它指向的元素。

为了澄清,似乎应该有一个类似矢量的容器,其中const 只是意味着用户不能更改容器的大小,但容器中的元素是可变的。我的主要问题是:有什么东西可以阻止这种类型的容器“const 正确”吗?

似乎通过添加额外的间接层(例如std::vector<std::unique_ptr<T>> const)来实现这一点,有几个hackish解决方法,但我正在寻找在维护方面不那么尴尬的东西。

顺便说一句,如果在 STL 容器之前将智能指针合并到语言中,那么 const 访问器是否仍会像今天一样定义?

【问题讨论】:

  • 您可以定义自己的类,该类使用组合间接作用于 mutable std::vector,并通过公共成员函数确保 const 正确性(在您的意义上)。
  • std::vector<T>::operator[] 返回一个引用。 std::vector<T>::operator[] const 返回一个常量引用。
  • @Marshall Clow 不知何故脱离了我的原始草稿。我会重新添加它。谢谢。

标签: c++ stl const-correctness


【解决方案1】:

为了澄清,似乎应该有一个类似矢量的容器,其中 const 只是意味着用户不能更改容器的大小,但容器中的元素是可变的。

那是std::array。您在编译时设置大小。对于在构造函数时设置大小,建议使用 dynarray

【讨论】:

  • 这对于vector来说似乎是合理的,但是其他的STL容器呢?拥有像 std::map 这样的东西似乎是合理的,你不能添加或删除键,但值是可变的。
  • 标准是库不是所有可能事物的集合。
  • 由于 constness 并不意味着在编译时已知的值,我宁愿将新的数组 spans/views 与不可调整大小的可变元素容器进行比较。但出于我不知道的原因,这些视图具有与 vector 相同的行为:它们的操作表现得好像视图是它的元素 - operator== 比较元素,而 const 与它们包装的指针相比更深。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-23
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多