2010-03-09 32 views

回答

4

这是因为复合文字中的“演员”根本不是演员 - 它看起来像一个。

复合文字(这是完整的构造(int){5})创建一个左值。然而,与其他大多数操作符一样,转换操作符只创建一个右值。

这个例子将被允许(但没用,就像你int例子):

++((char *){(char *)p}); 
&((char *){(char *)p}); 
4

复合文字没有在它。您的复合文字的(int)部分不是演员。它只是复合文字语法的类型部分。所以,在这种情况下,问题是复合文字是否是一个对象,左值。答案是肯定的,复合文字是一个左值。因此,您可以将任何需要左值的运算符(如++&)应用于其中。

示例的第二部分包含强制转换。演员的结果总是一个右值。您不能使用rvalues使用++&

1

在字面的化合物的“演员”实际上不铸造,而它是型复合文字的
所以,(int){5}确实更像一个匿名int,因此它可以在任何地方使用(在这种情况下int)相同类型的对象的有效lvalue可以被使用。

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

阅读Dr.Doobs's in-depth article关于复合文字。