次の例は、Cの有効な完全な翻訳単位ですか?
struct foo;
struct foo *bar(struct foo *j)
{
return &*j;
}
struct foo
は不完全な型ですが、C標準で不完全な型を間接参照することの明示的な禁止を見つけることができません。特に、§6.5.3.2は次のように述べています。
単項
&
演算子は、そのオペランドのアドレスを生成します。オペランドの型が「type」の場合、結果の型は「pointertotype」になります。オペランドが単項演算子の結果である場合、*
その演算子も演算子も&
評価されず、演算子の制約が引き続き適用され、結果が左辺値ではないことを除いて、結果は両方が省略されたかのようになります。
結果が左辺値ではないという事実は密接な関係はありません-戻り値はそうである必要はありません。*
演算子の制約は単純です。
単項*演算子のオペランドは、ポインター型でなければなりません。
および&
演算子は次のとおりです。
単項演算子のオペランドは
&
、関数指定子、単項演算子[]
または単項演算子の結果、または*
ビットフィールドではなくregister
ストレージクラス指定子で宣言されていないオブジェクトを指定する左辺値のいずれかでなければなりません。
ここでは両方とも簡単に満たされるので、結果はちょうど。と同等になるはずですreturn j;
。
ただし、gcc4.4.5はこのコードをコンパイルしません。代わりに、次のエラーが発生します。
y.c:5: error: dereferencing pointer to incomplete type
これはgccの欠陥ですか?