[英]Difference between cast used in Compound literals and that done on a pointer variable?
请考虑以下代码:
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 '&'
}
为什么复合文字不会在这里产生错误?
这是因为复合文字中的“演员”根本不是演员 - 它只是一个。
复合文字(完整构造(int){5}
)创建左值。 但是,与其他大多数运算符一样,强制转换运算符只会创建一个右值。
这个例子是允许的(但是没用,就像你的int
例子一样):
++((char *){(char *)p});
&((char *){(char *)p});
复合文字中没有强制转换 。 复合文字的(int)
部分不是强制转换。 它只是复合文字语法的一个类型部分。 因此,在这种情况下的问题是复合文字是一个对象,一个左值。 答案是肯定的,复合文字是左值。 因此,您可以将任何需要左值的运算符(如++
或&
)应用于它。
示例的第二部分包含强制转换。 演员表的结果总是一个右值。 你不能使用++
和&
rvalues。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.