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)复合文字部分不是强制转换。它只是复合文字语法的类型部分。因此,这种情况下的问题是复合文字是否是一个对象,一个左值。答案是肯定的,复合文字是左值。出于这个原因,您可以对它应用任何需要左值的运算符(如++or &)。

您的示例的第二部分包含强制转换。强制转换的结果始终是右值。您不能将++and&与右值一起使用。

于 2010-03-09T05:56:56.053 回答
1

复合文字中的“cast”实际上不是cast,而是复合文字的类型
因此,(int){5}确实更像是 anonymous int,因此lvalue可以在任何可以使用相同类型的对象(int在本例中)的任何地方使用 valid 。

然而,(char *)p实际上是一个强制转换( rvalue),所以它不能被递增++或引用&

阅读Dr.Doobs关于复合文字的深入文章。

于 2010-03-09T13:17:45.780 回答