据范围基于for循环文档here:即使在为其定义begin()/ end()时,基于范围的循环对于指针也不起作用?
begin_expr
和end_expr
定义如下:
- 如果range_expression是阵列类型的表达式,然后
begin_expr
被__range
和end_expr
是(__range + __bound)
,其中__bound
是数组中元素的数目(如果该数组有未知大小或是一个不完整的类型,该程序是非法的构造)- 如果
range_expression
是具有名为begin
和成员的类型C
的表达/或命名end
(无论类型或此类构件的可接近的)begin_expr
的成员,则是__range.begin
)和end_expr
是__range.end()
;- 否则,
begin_expr
是begin(__range)
和end_expr
是end(__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.
我没有看到指针从ADL排除任何引用,那么什么原因会不会有至于为什么这不起作用?
嗯。很高兴知道。 – Adrian
你知道这是否有任何动机,还是仅仅因为他们是如何定义它的? – Adrian