繁体   English   中英

复合文字中使用的强制转换与指针变量上的强制转换之间的区别?

[英]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。

复合文字中的“强制转换”实际上不是 强制转换 ,而是复合文字的类型
因此, (int){5}确实更像是一个匿名int ,因此可以使用一个有效的lvalue ,可以在任何可以使用相同类型的对象(在本例中为int )的地方使用。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM