标量类型的复合文字

时间:2015-06-24 08:46:33

标签: c compound-literals

由于c99复合文字可用于例如初始化指针:

int *p = (int []) {1, 2, 3, 4};

虽然这通常用于struct,但它也可用于初始化匿名数组(参见示例)。但是,如果我理解这正确地初始化这样的标量指针:

int *p = &(int) {4};

也有效。令我感到困惑的是gcc网站上的声明“允许标量类型和联合类型的复合文字,但复合文字等同于强制转换。”它们是否仅仅意味着使用地址 - 在匿名标量前面的运算符&是一种铸造形式?

1 个答案:

答案 0 :(得分:3)

根据定义,复合文字不包含&地址运算符。从N1570 6.5.2.5/p3 复合文字

  

由带括号的类型名称组成的后缀表达式   后跟括号括起来的初始化器列表是一个化合物   字面

现在,他们的陈述:

  

也允许标量类型和联合类型的复合文字,   但是复合文字相当于一个演员。

如果我正确地读它,

是错误的。复合文字和强制算子之间的根本区别在于前者是左值,如N1570 6.5.2.5/p4(强调我的):

  

否则(当类型名称指定对象类型时),类型为   复合文字是由类型名称指定的。在任何一个   例如,结果是左值

而后者不是,6.5.4/p5 演员(强调我的):

  

通过带括号的类型名称前面的表达式转换   表达式的值到命名类型。这种结构被称为   演员 .104)

     

104)演员不会产生左值。因此,铸造成合格的类型   与对该类型的不合格版本的强制转换具有相同的效果。