为什么提议的`std::shared_ptr::operator[]`接受`std::ptrdiff_t`作为参数?

14

6
也许是因为委员会最终认识到使用无符号类型作为索引是一个可怕的错误,他们正在试图在新的东西上进行改变? - NathanOliver
1
那为什么会是个错误呢?例如,使用 std::vector 完全没有问题。 - bipll
1
@bipll 尝试反向迭代是一种痛苦,这是一个好的开端。直觉上你可能会写成 for(auto i = cont.size() - 1; i > 0; --i) 但是由于它永远不会小于0所以你不能这样写。 - NathanOliver
2
我本来以为你可以给shared_ptr起别名,不像其他容器,你的shared_ptr实际上可以指向数组的中间,负索引可能是有意义的。但实际上它们要求索引必须为正数,所以在这里使用有符号类型没有任何意义。这似乎只是一个糟糕的决定。 - GManNickG
直觉上,我总是会在这种情况下写for(auto i(cont.rbegin()) - bipll
显示剩余10条评论
1个回答

1
可能这应该是指针接口统一化。当使用C语言旧式指针作为数组时,可以接受负索引: p[-2] 等同于 *(p - 2); 因此 ptrdiff_t 自然是有符号的。

1
要求:get() != 0 && i >= 0。无论如何,您都不能传递负索引。 - GManNickG
1
我也这么认为,但我有疑问——我们在std::unique_ptr中使用了一个无符号整数的先例。 - milleniumbug
1
@GManNickG 这似乎是一个不必要的限制。您可以使用别名构造函数来获取指向数组中间的指针。在这种情况下,ptr[-2]是有意义的。 - Tavian Barnes
使用shared_ptr的自定义删除器,传递new int[n] + 1并使用[-1]索引shared_ptr是完全合理的,我认为禁止负索引的原因不太清楚。 - Johannes Schaub - litb
2
“为什么要使用可以遇到错误的类型?”这个问题我们总是听到。如果传递一个 -1,无论 shared_ptr 是否使用 intunsigned,它都是一个错误。所以,这个问题实际上不应该说“允许我遇到一个错误”,而应该问“为什么要使用一种可以发现我遇到的错误的类型?” 这就是为什么 int 更优越 </signed-vs-unsigned>。 - Johannes Schaub - litb
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接