【问题标题】:Why does proposed `std::shared_ptr::operator[]` take `std::ptrdiff_t` as an argument为什么提议的 `std::shared_ptr::operator[]` 将 `std::ptrdiff_t` 作为参数
【发布时间】:2016-10-06 19:39:02
【问题描述】:

According to the N4562 proposal, the newly proposed std::shared_ptr::operator[] takes in std::ptrdiff_t, which is a signed type.

这与标准库中的每个索引运算符都不一致。甚至std::unique_ptr::operator[] 也接受std::size_t

做出这个决定的理由是什么?

【问题讨论】:

  • 也许是因为委员会最终承认使用无符号类型作为索引是一个可怕的错误,他们正试图在新的东西上改变它?
  • 那到底为什么是个错误?例如,使用std::vector 非常有意义。
  • @bipll 尝试向后迭代是一个痛苦的事实是一个好的开始。直觉上你会想写for(auto i = cont.size() - 1; i > 0; --i),但你不能,因为它永远不会小于0。
  • 我猜是因为你可以给 shared_ptr 起别名,不像其他容器,你的 shared_ptr 实际上可以指向数组的中间,负索引可能是有意义的。但他们实际上要求索引是正数,所以在这里使用有符号类型是没有意义的。这似乎只是一个糟糕的决定。
  • 在这种情况下,直觉上我总是会写for(auto i(cont.rbegin())

标签: c++ c++17


【解决方案1】:

大概这应该是指针接口的统一吧。当用作数组时,好的 ol' C 指针接受负索引:p[-2]*(p - 2) 相同;并且ptrdiff_t 是自然签名的。

【讨论】:

  • "要求:get() != 0 && i >= 0" 无论如何你都不能传递负索引。
  • 我也是这么认为的,但我对此表示怀疑——我们优先使用std::unique_ptr,它采用无符号整数。
  • 那么看起来是提案不一致。
  • @GManNickG 这似乎是一个不必要的限制。您可以使用别名构造函数来获取指向数组中间的指针。 ptr[-2] 在这种情况下是有意义的。
  • 问题“为什么使用允许我遇到错误的类型?”是我们经常听到的同一个问题。如果您传递-1,无论shared_ptr 是使用int 还是unsigned,它始终是一个错误。所以这个问题真的不应该说“让我遇到错误”,而应该是“为什么要使用允许我发现我遇到的错误的类型?”。这就是为什么int 优于 。
猜你喜欢
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 2018-01-02
  • 1970-01-01
相关资源
最近更新 更多