gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:00:02 25 4
gpt4 key购买 nike

为什么 std::span 只有 beginend 方法而不是它们的常量迭代器对应物 cbegincend ? ( standard )
我还注意到,我能找到的关于 span 的建议确实有 cbegincend 的定义: P0122R7 。为什么被删除了?

最佳答案

由于 LWG3320 ,这已被删除。
问题是 x.cbegin() 真的应该和 std::begin(std::as_const(x)) 做同样的事情,这就是 std::cbegin(x) 的定义。
std::span 的情况并非如此,因为它实际上并不拥有其元素,因此,只有浅常量。给定 span<int> s;s.cbegin() 会给你一个 int const* † 而 std::cbegin(s) 给你一个 int* 。这是非常不一致的。本来可以保留 s.cbegin() 而让它只返回 begin() (如 PL 247 所提议的那样),但这可以说是令人困惑的,因此决议决定是简单地删除所有 const 成员和别名。
在任何情况下,如果您希望容器本身是不可变的(从 std::cbegin(s) 开始这不是问题),则 span 始终有效。

†从技术上讲,实现已定义,不是必需的 int const* ,但出于解释目的,这是一个有用的虚构。

关于c++ - 为什么 std::span 缺少 cbegin 和 cend 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62757700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com