错误:在编译&(int){}时获取临时[-fpermissive]的地址

时间:2014-08-13 18:56:35

标签: gcc g++ compound-literals

前几天我在答案Compound literals

中发现了How do I use setsockopt(SO_REUSEADDR)?

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

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

使用gcc 4.9.1,它按预期构建和工作,它打印&#34; 3&#34;并且valgrind不会报告内存损坏。

但是使用g ++ 4.9.1时,它不会构建:

$ g++ main.c 
main.c: In function ‘int main()’:
main.c:4:23: error: taking address of temporary [-fpermissive]
  int * ptr = &(int) {3};
                       ^

是否有一种方法(比如g ++选项)支持Compound literal?

1 个答案:

答案 0 :(得分:1)

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

与此同时,GCC将复合文字带入C ++(作为非标准扩展),并带来了许多重大变化。它们被作为临时对象引入。在C ++中获取临时对象的地址是违法的。 C ++中复合文字的生命周期也与临时文本的生命周期一致 - 它们一直存在于表达式的末尾。

AFAIK,没有办法让GCC的C ++复合文字表现为C语言。