n3092を見ると、§6.5.4で、範囲ベースのforループと同等であることがわかります。次に、何に等しいかを言い続け__begin
ます__end
。それは配列と他のタイプを区別します、そして私はこれが冗長であると思います(別名混乱します)。
それは、配列タイプについて__begin
、__end
あなたが期待するものであると言っています:最初へのポインタと最後から1つへのポインタ。次に、他のタイプの場合、__begin
およびはADLでとに__end
等しくなりbegin(__range)
ます。§24.6.5で定義されているを見つけるために、end(__range)
名前空間std
が関連付けられています。std::begin
std::end
<iterator>
ただし、との定義を見るstd::begin
とstd::end
、これらは両方とも配列とコンテナタイプに対して定義されています。また、配列のバージョンは上記とまったく同じです。最初のポインタ、最後の1つを指すポインタです。
std::begin
他のタイプに与えられた定義が同様に機能するのに、なぜ配列を他のタイプと区別する必要があるのstd::end
ですか?
便宜上、いくつかの要約引用符:
§6.5.4範囲ベースの
for
ステートメント— _RangeTが配列型の場合、begin-exprとend-exprはそれぞれ__rangeと__range + __boundです。ここで、__boundは配列のバインドです。_RangeTが不明なサイズの配列または不完全な型の配列である場合、プログラムの形式が正しくありません。
—それ以外の場合、begin-exprとend-exprはそれぞれbegin(__ range)とend(__range)であり、beginとendは引数依存のルックアップ(3.4.2)でルックアップされます。この名前空間のルックアップでは、名前空間stdは関連付けられた名前空間です。
§24.6.5範囲アクセス
template <class T, size_t N> T* begin(T (&array)[N]);
戻り値:配列。
template <class T, size_t N> T* end(T (&array)[N]);
戻り値:配列+N。