ошибка: получение адреса временного [-fpermissive] при компиляции &(int) {}

Несколько дней назад я обнаружил составные литералы в ответе Как использовать setsockopt(SO_REUSEADDR)?

Поэтому я попытался скомпилировать простой код:

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

Используя gcc 4.9.1, он собирается и работает так, как ожидалось, печатает «3», а 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++) для поддержки составного литерала?


person mpromonet    schedule 13.08.2014    source источник
comment
g++ отлично поддерживает составные литералы, он просто не позволяет вам взять адрес одного из них, что разумно. Это также не позволяет вам использовать адрес других типов литералов, например. int* p = &3;, что тоже разумно. Что плохого в том, чтобы сказать int i = (int){3}; printf("%d\n", i); вместо того, чтобы попытаться взять его адрес?   -  person Jonathan Wakely    schedule 13.08.2014


Ответы (1)


В языке C составные литералы — это lvalue. Совершенно законно брать адрес составного литерала в C. В C локальный составной литерал живет до конца окружающего его блока.

Между тем, GCC переносит составные литералы в C++ (как нестандартное расширение) с рядом существенных изменений. Они переносятся как временные объекты. Незаконно брать адрес временного объекта в C++. Время жизни составных литералов в C++ также согласуется со временем жизни временных — они живут до конца выражения.

Насколько я знаю, нет никакого способа заставить составные литералы C++ GCC вести себя как их аналоги C.

person AnT    schedule 13.08.2014
comment
@dyp: ты прав. Но ОП, кажется, знает, что составные литералы поддерживаются в версии C++ GCC как нестандартное расширение. - person AnT; 14.08.2014
comment
Интересно. Вы также можете добавить ссылку на документацию gcc: составные литералы (и их семантика в С++) - person dyp; 14.08.2014