x.cbegin()
和 std::cbegin(x)
将执行不同的操作,但现在 x.cbegin()
和 std::ranges::cbegin(x)
执行相同的操作。
x.cbegin()
实际上应该和 std::begin(std::as_const(x))
做相同的操作,这正是 std::cbegin(x)
定义的操作。std::span
,情况并非如此,因为它实际上没有拥有其元素,并且只有浅层的const。对于给定的 span<int> s;
,s.cbegin()
将会给你一个 int const*
†,而 std::cbegin(s)
将给你一个 int*
。这非常不一致。可能可以保留 s.cbegin()
,同时使它只返回 begin()
(如 PL 247 所建议的),但这可能会引起混淆,因此决定删除所有const成员和别名。无论如何,如果您希望容器本身是不可变的(这对于span
本身不是问题),std::cbegin(s)
始终有效。
†技术上来说,是实现定义,而不是必须是int const*
,但出于说明目的,这是一个有用的假设。
cbegin
等返回一个const迭代器,但我同意这会带来一些混淆。 那现在最好的方法是什么来获取元素的const迭代器呢? - SWdVspan<T>
转换为span<T const>
。 - Barry