2017-01-22 3 views
3

標準状態:最後の要素を過ぎて比較してもよいのはなぜですか?

両方のポインタが同じ配列オブジェクトまたは配列オブジェクトの最後の要素過去1の要素を指していない限り、動作は未定義です。

なぜ最後の要素を過ぎて参照するのが有効ですか?

+3

標準で有効であると記載されているため、 –

+0

@EdgarRokyan;だからこそ彼はこの理由を望んでいる。 – haccks

+0

参照されるのは、ポインタの計算値*だけであることを明確にすることができます。その場所に住んでいる実際の*オブジェクト*は法的に参照可能ではありません。 – WhozCraig

答えて

5

ポインタを計算して比較するだけで問題ありません。その理由は、ポインタのペアを使って渡したり、繰り返したりするのに使うことができるからです。

それは標準では許されなかった場合は、次のループは、これはC++、 "としての範囲を渡すのイディオムでは特に重要であるpend

int arr[100] = {0}; 

for (int *pbegin = arr, *pend = arr + 100; pbegin != pend; ++pbegin) 
{ 
    // do stuff 
} 

の単なる存在によって未定義の動作を示しているだろう最初と最後までのイテレータ "は、標準ライブラリによって大きく使用されます。

+0

これは私が期待していたものです。しかし、なぜそれが '... * pendAndOne = arr + 101;に未定義ですか? pbegin!=(pendAndOne - 1); ... ' – wulfgarpro

+1

@wulfgarpro - それが標準委員会が決定した理由です。有用なイディオムを容易にするために単一の例外を作ることは、それらにとって妥当と思われました。他のすべてを未定義のビヘイビアとして残すことで、さまざまな実装がさまざまな環境をサポートできるようになります。 – StoryTeller

+0

@wulfgarpro '... * pendAndOne = arr + 101;'が許されている場合、 '... * pendAndOne = arr + 102;'についてはどうでしょうか? ... – songyuanyao

関連する問題