由于c99
复合文字可用于例如初始化指针:
int *p = (int []) {1, 2, 3, 4};
虽然这通常用于struct
,但它也可用于初始化匿名数组(参见示例)。但是,如果我理解这正确地初始化这样的标量指针:
int *p = &(int) {4};
也有效。令我感到困惑的是gcc
网站上的声明“允许标量类型和联合类型的复合文字,但复合文字等同于强制转换。”它们是否仅仅意味着使用地址 - 在匿名标量前面的运算符&
是一种铸造形式?
答案 0 :(得分:3)
根据定义,复合文字不包含&
地址运算符。从N1570 6.5.2.5/p3
复合文字:
由带括号的类型名称组成的后缀表达式 后跟括号括起来的初始化器列表是一个化合物 字面
现在,他们的陈述:
如果我正确地读它,也允许标量类型和联合类型的复合文字, 但是复合文字相当于一个演员。
是错误的。复合文字和强制算子之间的根本区别在于前者是左值,如N1570 6.5.2.5/p4
(强调我的):
否则(当类型名称指定对象类型时),类型为 复合文字是由类型名称指定的。在任何一个 例如,结果是左值。
而后者不是,6.5.4/p5
演员(强调我的):
通过带括号的类型名称前面的表达式转换 表达式的值到命名类型。这种结构被称为 演员 .104)
104)演员不会产生左值。因此,铸造成合格的类型 与对该类型的不合格版本的强制转换具有相同的效果。