为什么std::span缺少cbegin和cend方法?

14

为什么std::span只有beginend方法,而没有它们的常量迭代器对应物cbegincend?(标准)

我注意到的是,我能找到的关于span的提案确实定义了cbegincendP0122R7。为什么会被删除?

1个回答

14
更新:这些通过 P2278R4 重新添加。下面指出的LWG问题仍然存在,x.cbegin()std::cbegin(x) 将执行不同的操作,但现在 x.cbegin()std::ranges::cbegin(x) 执行相同的操作。
这是由于 LWG3320 的结果而被移除。
问题在于 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迭代器呢? - SWdV
2
@SWdV 首先你需要将 span<T> 转换为 span<T const> - Barry
"浅拷贝"是什么意思? - undefined

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