即使为它定义了begin()/ end(),基于for循环的范围也不能与指针一起使用?

时间:2017-10-10 22:33:41

标签: c++11 for-loop

根据循环文档的范围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;
    }
}

Demo

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

2 个答案:

答案 0 :(得分:2)

  

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

     

(2.1) - 如果T是基本类型,其关联的命名空间和类集都是空的......

     

(2.4) - 如果T是指向UU数组的指针,则其关联的命名空间和类是与U ... < / p>

从这些名称中,与char const*关联的一组名称空间是空的,因此ADL无需查看。

答案 1 :(得分:0)

问题在于这一部分:

  

未执行非ADL查找

在此上下文中的

beginend将通过非ADL查找而不是ADL找到,因为指针不是“在全局命名空间中定义的”。