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
がargument-dependent lookupを介して発見さbegin(__range)
とend_expr
end(__range)
である(非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;
}
}
エラー(秒):私はポインタがADLから除外されていることをすべての参照が表示されていないので、どのような理由があるだろう
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.
なぜこれが機能していないのか?
Hmm。知っておいてよかった。 – Adrian
それが動機付けされているかどうか、あるいはそれがそれをどう定義したかということだけが分かっていますか? – Adrian