由于c99
复合文字可用于例如初始化指针:
int *p = (int []) {1, 2, 3, 4};
虽然这通常用于struct
s 它也可以用于初始化匿名数组(参见示例)。但是,如果我理解正确地初始化这样的标量指针:
int *p = &(int) {4};
也是有效的。我觉得令人困惑的是gcc
网站上的声明“标量类型和联合类型的复合文字也是允许的,但是复合文字相当于强制转换。” 它们是否仅仅意味着&
在匿名标量前使用地址运算符是一种强制转换形式?
由于c99
复合文字可用于例如初始化指针:
int *p = (int []) {1, 2, 3, 4};
虽然这通常用于struct
s 它也可以用于初始化匿名数组(参见示例)。但是,如果我理解正确地初始化这样的标量指针:
int *p = &(int) {4};
也是有效的。我觉得令人困惑的是gcc
网站上的声明“标量类型和联合类型的复合文字也是允许的,但是复合文字相当于强制转换。” 它们是否仅仅意味着&
在匿名标量前使用地址运算符是一种强制转换形式?
根据定义,复合文字不包含&
地址运算符。来自 N15706.5.2.5/p3
复合文字:
由带括号的类型名称后跟用大括号括起来的初始化器列表组成的后缀表达式是复合文字。
现在,他们的声明:
标量类型和联合类型的复合文字也是允许的,但复合文字等价于强制转换。
如果我阅读正确,那就错了。复合文字和强制转换运算符之间的根本区别在于前者是lvalue,如 N1570 6.5.2.5/p4
(强调我的):
否则(当类型名称指定对象类型时),复合文字的类型是类型名称指定的类型。无论哪种情况,结果都是左值。
虽然后者不是,但6.5.4/p5
Cast 运算符(强调我的):
在表达式前面加上带括号的类型名称会将表达式的值转换为指定类型。这种结构称为铸件.104)
104)强制转换不会产生左值。因此,强制类型转换与类型的非限定版本具有相同的效果。