6.5.2.5/4一节提供了关于表单( type-name ) { initializer-list }的postfix-expression的说明。下面是:
如果类型名称指定一个未知大小的数组,大小由6.7.9中指定的初始化程序列表确定,复合文字的类型是完整数组类型的类型。否则(当类型名称指定对象类型时),复合文字的类型就是由类型名称指定的类型。无论是哪种情况,结果都是一个
lvalue。
我不明白the type of the compound literal的用词。文字怎么可能有一个类型呢?对应的未命名对象的类型是指the type of the compound literal吗?
例如
long long *longs = (long long []) {1333, 3123, 3, 122};此处的initializer-list用于初始化类型为long long [4]的未命名对象。
此外,还不清楚In either case, the result is an lvalue的目的是什么。在assignment-expression中使用时,lvalue conversion是在右操作数上执行的,因此它不再是一个lvalue。
发布于 2019-08-12 10:26:22
想必,“复合文字”是指使用“复合文字”语言构造所指定的对象/值。值/对象在C中有类型。
生成复合文本lvalue的目的是使类似于int *x = &(int){42}; *x = 43;的代码工作。这使得复合文字的行为有点像匿名变量。(不过,并不是完全如此。与正则变量不同,复合文本不能有存储类说明符,我个人认为这是语言缺陷。)
发布于 2019-08-12 10:26:45
复合文字的主要用途是提供一个匿名对象,这样您就可以拥有一个指向真实对象的指针,而无需首先创建变量。
这是一个lvalue,这意味着一个人可以获得它的地址。但是,它不是可修改的lvalue,就像一个普通的数组对象:
int a[] = {0, 0};
a = {1, 2}; // error, a is not a modifiable lvalue但是当然,您可以使用下标运算符或间接指针访问来修改它:
a[0] = 1; // fine
(long long []) {1333, 3123, 3, 122}[0] = 1; // fine as wellhttps://stackoverflow.com/questions/57459199
复制相似问题