2017-10-10 52 views
1

据范围基于for循环文档here即使在为其定义begin()/ end()时,基于范围的循环对于指针也不起作用?

begin_exprend_expr定义如下:

  • 如果range_expression是阵列类型的表达式,然后begin_expr__rangeend_expr(__range + __bound),其中__bound是数组中元素的数目(如果该数组有未知大小或是一个不完整的类型,该程序是非法的构造)
  • 如果range_expression是具有名为begin和成员的类型C的表达/或命名end(无论类型或此类构件的可接近的)begin_expr的成员,则是__range.begin)和end_expr__range.end();
  • 否则,begin_exprbegin(__range)end_exprend(__range),它们经由argument-dependent lookup实测值(不进行非ADL查找)。

但是,如果我定义begin()end()为指针类型,它不能正常工作。

#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; 
    } 
} 

错误(S):

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. 

Demo

我没有看到指针从ADL排除任何引用,那么什么原因会不会有至于为什么这不起作用?

回答

2

[basic.lookup.argdep]/2对于在函数调用每个参数类型T,有一组零个或多个相关联的命名空间和一个 组零个或多个相关联的类被认为是...

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

(2.4) - 如果T是指向UU阵列,其相关联的命名空间和类是那些具有相关联U ...

从这些,与char const* asscociated一组命名空间是空的,所以ADL没有什么可以看的。

+0

嗯。很高兴知道。 – Adrian

+0

你知道这是否有任何动机,还是仅仅因为他们是如何定义它的? – Adrian

0

的问题是这一部分:不执行

非ADL查找

begin并在这方面end将通过非ADL查找来发现,而不是ADL因为指针AREN在全局命名空间中定义't'“。

相关问题