gpt4 book ai didi

c++ - 为什么 std::cbegin() 不在容器上调用 .cbegin() ?

转载 作者:IT老高 更新时间:2023-10-28 22:20:03 27 4
gpt4 key购买 nike

以下代码使静态断言失败:

#include <gsl/span>
#include <iterator>
#include <type_traits>

int main()
{
int theArr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
gsl::span<int> theSpan{ theArr, std::size(theArr) };

using std::cbegin;
auto it1 = cbegin(theSpan);
auto it2 = theSpan.cbegin();
static_assert(std::is_same_v<decltype(it1), decltype(it2)>);
}

这会失败,因为 std::cbegin() 在容器的 const ref 上调用 .begin() 方法。对于标准定义的容器,这将返回一个 const_iterator,它与 .cbegin() 返回的类型相同。但是,gsl::span 有点独特,因为它模拟了一种“借用类型”。 const gsl::span 的行为类似于 const 指针; span 本身是 const,但它指向的不是 const。因此,const gsl::span 上的 .begin() 方法仍然返回一个非常量迭代器,而显式调用 .cbegin() 返回一个常量迭代器。

我很好奇为什么 std::cbegin() 没有被定义为在容器上调用 .cbegin() (所有标准容器似乎都实现了) 以解决此类情况。

这有点相关:Why does std::cbegin return the same type as std::begin

最佳答案

this fails because std::cbegin() calls the .begin()

更准确地说,std::cbegin 调用 std::begin,后者在泛型重载中调用 c.begin

对于它的值(value),应该可以修复 gsl::span 如果 gsl 的设计者指定有对 gsl::spanstd::cbegin 通用重载的特化,它使用 c.cbegin 而不是 std::开始,如果这是所需的行为。我不知道他们不指定这种特化的原因。

至于为什么 std::cbegin 使用 std::begin 的原因,我也不知道,但它确实有能够支持具有 c.begin 成员但没有 c.cbegin 成员的容器,这可以被视为不太严格的要求,因为它可以通过自定义容器来满足在 C++11 之前编写,当时没有提供 c.cbegin 成员函数的约定。

关于c++ - 为什么 std::cbegin() 不在容器上调用 .cbegin() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56828691/

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