根据N4562提案,新提出的std::shared_ptr::operator[]
接受有符号类型std::ptrdiff_t
。
这与标准库中的每个索引运算符都不一致。甚至std::unique_ptr::operator[]
也采用了std::size_t
。
这个决定的理由是什么?
根据N4562提案,新提出的std::shared_ptr::operator[]
接受有符号类型std::ptrdiff_t
。
这与标准库中的每个索引运算符都不一致。甚至std::unique_ptr::operator[]
也采用了std::size_t
。
这个决定的理由是什么?
p[-2]
等同于 *(p - 2)
; 因此 ptrdiff_t
自然是有符号的。get() != 0 && i >= 0
。无论如何,您都不能传递负索引。 - GManNickGstd::unique_ptr
中使用了一个无符号整数的先例。 - milleniumbugptr[-2]
是有意义的。 - Tavian Barnesshared_ptr
的自定义删除器,传递new int[n] + 1
并使用[-1]
索引shared_ptr
是完全合理的,我认为禁止负索引的原因不太清楚。 - Johannes Schaub - litb-1
,无论 shared_ptr
是否使用 int
或 unsigned
,它都是一个错误。所以,这个问题实际上不应该说“允许我遇到一个错误”,而应该问“为什么要使用一种可以发现我遇到的错误的类型?” 这就是为什么 int
更优越 </signed-vs-unsigned>。 - Johannes Schaub - litb
std::vector
完全没有问题。 - bipllfor(auto i = cont.size() - 1; i > 0; --i)
但是由于它永远不会小于0所以你不能这样写。 - NathanOlivershared_ptr
起别名,不像其他容器,你的shared_ptr
实际上可以指向数组的中间,负索引可能是有意义的。但实际上它们要求索引必须为正数,所以在这里使用有符号类型没有任何意义。这似乎只是一个糟糕的决定。 - GManNickGfor(auto i(cont.rbegin())
。 - bipll