C++11 基于范围的循环不';即使为指针定义了begin()/end(),也不能使用指针?

C++11 基于范围的循环不';即使为指针定义了begin()/end(),也不能使用指针?,c++11,for-loop,C++11,For Loop,根据基于范围的for循环文档: begin_expr和end_expr的定义如下: 如果range\u表达式是数组类型的表达式,那么begin\u expr是\u range而end\u expr是(\uu range+\uu-bound),其中\uu-bound是数组中的元素数(如果数组大小未知或类型不完整,则程序格式错误) 如果range\u expression是类类型C的表达式,其成员名为begin和/或成员名为end(无论该成员的类型或可访问性如何),则begin\u expr是\uu

根据基于范围的for循环文档:

begin_expr
end_expr
的定义如下:

  • 如果range\u表达式是数组类型的表达式,那么
    begin\u expr
    \u range
    end\u expr
    (\uu range+\uu-bound)
    ,其中
    \uu-bound
    是数组中的元素数(如果数组大小未知或类型不完整,则程序格式错误)
  • 如果
    range\u expression
    是类类型
    C
    的表达式,其成员名为
    begin
    和/或成员名为
    end
    (无论该成员的类型或可访问性如何),则
    begin\u expr
    \uu range.begin
    ),而
    end\u expr
    \uu range.end();
    
  • 否则,
    begin\u expr
    begin(\uu范围)
    end\u expr
    end(\uu范围)
    ,通过(不执行非ADL查找)找到。
但是,如果我为指针类型定义了
begin()
end()
,它将无法工作

例子


我没有看到任何关于指针被排除在ADL之外的引用,那么这不起作用的原因是什么呢

问题在于这一部分:

不执行非ADL查找

此上下文中的
begin
end
将通过非ADL查找而不是ADL查找,因为指针不是“在全局命名空间中定义的”

[basic.lookup.argdep]/2对于函数调用中的每个参数类型
T
,都有一组零个或多个关联的名称空间和 要考虑的零个或多个关联类的集合

(2.1)-如果
T
是基本类型,则其相关的名称空间集和类集都是空的

(2.4)-如果
T
是指向
U
的指针或
U
的数组,则其关联的命名空间和类是与
U
关联的命名空间和类


从这些名称中,与
char const*
关联的一组名称空间是空的,因此ADL没有什么可看的。

Hmm。很高兴知道。你知道这是出于什么动机,还是仅仅因为他们是这样定义的?
#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;
    }
}
source_file.cpp:18:17: error: invalid range expression of type 'const char *'; no viable 'begin' function available
    for (auto c : text)
                ^ ~~~~
1 error generated.