为什么 std::span 缺少 cbegin 和 cend 方法?
Why does std::span lack cbegin and cend methods?
为什么 std::span
只有 begin
和 end
方法而不是常量迭代器对应的 cbegin
和 cend
? (standard)
我也注意到,我能找到的跨度提案确实有 cbegin
和 cend
的定义: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()
而只保留 return begin()
(如 PL 247 所提议),但这可能令人困惑,因此解决方案的决定是简单地删除所有 const成员和别名。
在任何情况下,如果您希望容器本身不可变(这对于 span
来说不是问题),std::cbegin(s)
始终有效。
†从技术上讲,实现已定义,不是必需的int const*
,但这是出于解释目的的有用虚构。
为什么 std::span
只有 begin
和 end
方法而不是常量迭代器对应的 cbegin
和 cend
? (standard)
我也注意到,我能找到的跨度提案确实有 cbegin
和 cend
的定义: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()
而只保留 return begin()
(如 PL 247 所提议),但这可能令人困惑,因此解决方案的决定是简单地删除所有 const成员和别名。
在任何情况下,如果您希望容器本身不可变(这对于 span
来说不是问题),std::cbegin(s)
始终有效。
†从技术上讲,实现已定义,不是必需的int const*
,但这是出于解释目的的有用虚构。