2

次のコードを検討してください。

int main()
{ 
    int *p;

    ++((int){5});    //compile without err/warning
    &((int){5});     //compile without err/warning

    ++((char *)p);   //Compile-time err: invalid lvalue in increment
    &((char *)p);    //Compile-time err: invalid lvalue in unary '&'

}

ここで複合リテラルがエラーを生成しないのはなぜですか?

4

3 に答える 3

4

これは、複合リテラルの「キャスト」がキャストではないためです。キャストのように見えるだけです。

複合リテラル (完全な構造(int){5}) は左辺値を作成します。ただし、キャスト演算子は、他のほとんどの演算子と同様に、右辺値のみを作成します。

この例は許可されます(ただし、例のように役に立たないint):

++((char *){(char *)p});
&((char *){(char *)p});
于 2010-03-09T05:55:33.043 に答える
4

複合リテラルにはキャストがありません。(int)複合リテラルの一部はキャストではありません。これは、複合リテラル構文の型部分にすぎません。したがって、この場合の問題は、複合リテラルがオブジェクト (左辺値) であるかどうかです。答えはイエスです。複合リテラルは左辺値です。このため、左辺値を必要とする任意の演算子 (++または など&) をそれに適用できます。

例の 2 番目の部分にはキャストが含まれています。キャストの結果は常に右辺値です。++and を右辺値と一緒に使用することはできません&

于 2010-03-09T05:56:56.053 に答える
1

複合リテラルの「キャスト」は実際にはキャストではなく複合リテラルのです。 したがって、実際には anonymous に似ているため、同じ(この場合) のオブジェクトを使用できる場所ならどこでも使用できるvalid です。
(int){5}intlvalueint

一方、(char *)pは実際にはキャスト( ) であるため、インクリメントまたは参照rvalueすることはできません。++&

複合リテラルに関するDr.Doobs の詳細な記事を読んでください。

于 2010-03-09T13:17:45.780 に答える