标量类型的复合字面量

4
自从复合字面量问世以来,它可以用于初始化指针等操作:
int *p = (int []) {1, 2, 3, 4};

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

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

这个也是有效的。我觉得令人困惑的是在gcc网站上的声明:“对于标量类型和联合类型,复合字面值也被允许,但是那时复合字面值相当于一个强制转换。”他们是否只是意味着在匿名标量前使用取地址符&是一种强制转换形式?


https://gcc.gnu.org/onlinedocs/gcc/Compound-Literals.html - lord.garbage
1个回答

4
根据定义,复合字面量不包含&地址运算符。从N1570 6.5.2.5/p3 复合字面量: "由带括号的类型名称和花括号括起来的初始化列表组成的后缀表达式是一个复合字面量。"
现在,他们的陈述: "标量类型和联合类型的复合字面量也是允许的,但那时复合字面量等同于一个转换。"
如果我理解正确,这个陈述是错误的。复合字面量和转换运算符之间的根本区别在于前者是一个左值,如N1570 6.5.2.5/p4 (重点是我的): "否则(当类型名称指定一个对象类型时),复合字面量的类型为类型名称指定的类型。在任一情况下,结果都是一个左值。"
而后者不是,6.5.4/p5 转换运算符 (重点是我的): "用括号括起来的类型名称在表达式之前将表达式的值转换为命名类型。这个结构被称为转换.sup .104) 104)转换不产生左值。因此,到限定类型的转换与到该类型的未限定版本的转换具有相同的效果。"

1
复合字面量和强制类型转换符之间的根本区别在于,后者是一个左值[...]。难道这不应该是“前者”吗? - lord.garbage
好的,使用复合字面量来初始化标量指针没有什么特别之处吗? - lord.garbage
@brauner:不,这就像你用它初始化匿名数组一样。 - Grzegorz Szpetkowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接