gpt4 book ai didi

c++ - 基于范围的语句定义冗余

转载 作者:IT老高 更新时间:2023-10-28 21:57:10 28 4
gpt4 key购买 nike

查看 n3092,在第 6.5.4 节中,我们找到了基于范围的 for 循环的等价物。然后它继续说__begin__end等于。它区分了数组和其他类型,我发现这是多余的(也就是令人困惑)。

它表示数组类型 __begin__end是你所期望的:一个指向第一个指针和一个指向一个结束的指针。那么对于其他类型,__begin__end等于 begin(__range)end(__range) , 与 ADL。命名空间 std关联,以便找到 std::beginstd::end定义于 <iterator> , §24.6.5.

但是,如果我们查看 std::begin 的定义和 std::end ,它们都是为数组和容器类型定义的。并且数组版本的作用与上面完全相同:指向第一个的指针,指向末尾的指针。

为什么需要将数组与其他类型区分开来,而为其他类型给出的定义也同样适用,发现 std::beginstd::end ?


为方便起见,摘录了一些引号:

§6.5.4 The range-based for statement

— if _RangeT is an array type, begin-expr and end-expr are __range and __range + __bound, respectively, where __bound is the array bound. If _RangeT is an array of unknown size or an array of incomplete type, the program is ill-formed.

— otherwise, begin-expr and end-expr are begin(__range) and end(__range), respectively, where begin and end are looked up with argument-dependent lookup (3.4.2). For the purposes of this name lookup, namespace std is an associated namespace.

§24.6.5 range access

template <class T, size_t N> T* begin(T (&array)[N]);

Returns: array.

template <class T, size_t N> T* end(T (&array)[N]);

Returns: array + N.

最佳答案

这避免了 ADL 的极端情况:

namespace other {
struct T {};
int begin(T*) { return 42; }
}

other::T a[3];
for (auto v : a) {}

因为 ADL 在调用 begin(a) 时会找到 other::begin,所以等效代码会中断,从而导致令人困惑的编译错误(沿着“can't compare int to other::T *"as end(a) 将返回一个 T*) 或不同的行为(如果 other::end 被定义并做了同样意想不到的事情)。

关于c++ - 基于范围的语句定义冗余,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2648878/

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