根据循环文档的范围here:
begin_expr
和end_expr
的定义如下:
- 如果range_expression是数组类型的表达式,则
begin_expr
为__range
且end_expr
为{{ 1}},其中(__range + __bound)
是数组中元素的数量(如果数组大小未知或类型不完整,则程序格式错误)- 如果
__bound
是类型range_expression
的表达式,其成员名为C
和/或成员名为begin
(无论此类成员的类型或可访问性),然后end
为begin_expr
),__range.begin
为end_expr
;- 否则,
__range.end()
为begin_expr
且begin(__range)
为end_expr
,已找到通过argument-dependent lookup(不执行非ADL查找)。
但是,如果我为指针类型定义end(__range)
和begin()
,则无法正常工作。
end()
错误(S):
#include <iostream>
using LPCSTR = char const*;
LPCSTR begin(LPCSTR str)
{
return str;
}
LPCSTR end(LPCSTR str)
{
return str + strlen(str);
}
int main()
{
LPCSTR text = "Hello, world!\n";
for (auto c : text)
{
std::cout << c;
}
}
我没有看到任何关于指针被排除在ADL之外的参考,那么为什么这不起作用的原因是什么呢?
答案 0 :(得分:2)
[basic.lookup.argdep] / 2 对于函数调用中的每个参数类型
T
,都有一组零个或多个关联的命名空间和一个 要考虑的零个或多个相关类的集合......(2.1) - 如果
T
是基本类型,其关联的命名空间和类集都是空的......(2.4) - 如果
T
是指向U
或U
数组的指针,则其关联的命名空间和类是与U
... < / p>
从这些名称中,与char const*
关联的一组名称空间是空的,因此ADL无需查看。
答案 1 :(得分:0)
问题在于这一部分:
在此上下文中的未执行非ADL查找
begin
和end
将通过非ADL查找而不是ADL找到,因为指针不是“在全局命名空间中定义的”。