17

それが常に真c99/c++03であることを保証しますか?&a+1 > &a

たとえば、 (c-like)std::copyがあり、

int a = 0 ;
int b[9] ;
std__copy(&a , &a+1 , b) ;

これは常に機能しますか?

4

2 に答える 2

17

はい、C99 には、アドレスを操作する場合、任意のオブジェクトaが 1 項目の配列のように機能するという特別な表現があるため、&a+1有効です (§6.5.6/7):

これらの演算子の目的上、配列の要素ではないオブジェクトへのポインターは、要素の型としてオブジェクトの型を持つ長さ 1 の配列の最初の要素へのポインターと同じように動作します。

セクション番号は異なりますが (§6.3.6)、C90 は同じ要件を示しています。

C++ には、§5.7/4 で同じ要件があります (C++03 と C++11 の両方で同じセクション番号)。

std::lessC++ では、組み込みの演算子が意味のある結果を生成しない場合でも(同じ型の) 任意のオブジェクトのアドレスを比較できます<(たとえば、同じ配列の一部ではない 2 つのオブジェクト) (§20.8.5/7) ):

テンプレートgreaterlessgreater_equal、およびless_equalの場合、組み込み演算子 <、>、<=、>= がそうでない場合でも、任意のポインター型の特殊化によって全体の順序が生成されます。

また、これらのアドレスを作成してオブジェクトのアドレスと比較することはできますが、これらのポインターを逆参照することはできないことに注意してください(そうしようとしても、コンパイラーはおそらく停止しませんが、結果は未定義の動作になります)。

于 2013-04-30T13:42:00.687 に答える
3

はい、それは C++ で保証されています (C については知りません)。具体的には、型 T の変数は同じ型の単一要素の配列と同等であり、配列の末尾を超えて常にポインターを取得できます。

于 2013-04-30T13:31:50.120 に答える