考虑以下代码:
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 '&'
}为什么复合文字不会在这里生成错误?
发布于 2010-03-09 13:55:33
这是因为复合文字中的“强制转换”根本不是强制转换-它只是看起来像一个强制转换。
复合文字(这是完整的构造(int){5})创建一个左值。然而,强制转换操作符只创建一个右值,就像大多数其他操作符一样。
这个例子是允许的(但就像你的int例子一样没用):
++((char *){(char *)p});
&((char *){(char *)p});发布于 2010-03-09 13:56:56
复合文字中没有类型转换。复合文字的(int)部分不是强制转换。它只是复合文字语法的一个类型部分。所以,这种情况下的问题是,复合文字是否是一个对象,一个左值。答案是肯定的,复合文字是一个左值。因此,您可以对其应用任何需要左值的运算符(如++或&)。
示例的第二部分包含类型转换。强制转换的结果始终是右值。不能将++和&与rvalues一起使用。
发布于 2010-03-09 21:17:46
复合文字中的“”实际上不是强制转换,而是复合文字的类型。
因此,(int){5}实际上更像是一个匿名int,因此一个有效的lvalue可以在任何可以使用相同类型的对象(在本例中是int)的地方使用。
然而,(char *)p实际上是一个类型转换(rvalue),因此它不能是递增的++或引用的&。
阅读有关复合文字的Dr.Doobs's in-depth article。
https://stackoverflow.com/questions/2406933
复制相似问题