C++11 基于范围的循环不';即使为指针定义了begin()/end(),也不能使用指针?
根据基于范围的for循环文档: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
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
,通过(不执行非ADL查找)找到。end(\uu范围)
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.