Gcc 错误:编译时获取临时[-fppermission]的地址(&P);(int){}

Gcc 错误:编译时获取临时[-fppermission]的地址(&P);(int){},gcc,g++,compound-literals,Gcc,G++,Compound Literals,我几天前在答案中发现 所以我试着编译简单的代码: #include <stdio.h> int main() { int * ptr = &(int) {3}; printf("%d\n", *ptr); return 0; } 是否有一种方法(如g++选项)支持复合文字?在C语言中,复合文字是左值。在C中获取复合文字的地址是完全合法的。在C中,本地复合文字一直存在到其封闭块的末尾 P>同时,GCC将复合文字引入到C++(作为非标准扩展)中,并发生

我几天前在答案中发现

所以我试着编译简单的代码:

#include <stdio.h>
int main()
{
    int * ptr = &(int) {3};
    printf("%d\n", *ptr);
    return 0;
}

是否有一种方法(如g++选项)支持复合文字?

在C语言中,复合文字是左值。在C中获取复合文字的地址是完全合法的。在C中,本地复合文字一直存在到其封闭块的末尾

<> P>同时,GCC将复合文字引入到C++(作为非标准扩展)中,并发生了一些显著的变化。它们是作为临时物品带过来的。在C++中,使用临时对象的地址是非法的。C++中复合文字的生存期也与临时的生存期一致,它们生存到表达式的末尾。
<> P> AFI,没有办法使GCC的C++复合文字像C语言一样运行。

G+支持好的复合文字,它不允许你取一个地址,这是明智的。它也不允许您使用其他类型文字的地址,例如
int*p=&3,这也是合理的。说
inti=(int){3}有什么不对;printf(“%d\n”,i)而不是试图记录它的地址?@dyp:你说得对。但是OP似乎知道,GCC的C++文本版本支持复合文字,这是一种非标准的扩展。您还可以添加到
$ g++ main.c 
main.c: In function ‘int main()’:
main.c:4:23: error: taking address of temporary [-fpermissive]
  int * ptr = &(int) {3};
                       ^