Übernahme der Adresse des temporären (zusammengesetzten Literal) Parameters in C

8

Ich kann mir nicht vorstellen, dass dies nicht schon doppelt ist, aber ich kann die Antwort nicht leicht finden, da die komplexeren Szenarien speziell für C ++ die Diskussion zu dominieren scheinen 0 .

Ist es legal, die Adresse eines temporären Konstrukts in der Parameterliste eines Funktionsaufrufs in C99 zu nehmen?

Beispiel: init_list oder init_desig_init wie folgt:

%Vor%

Die großen drei 1 scheinen es gut zu kompilieren , aber ich konnte nicht wirklich eine finden Referenz, die erklärt, dass die Lebensdauer des Temporären zumindest durch den Funktionsaufruf verlängert wird.

0 Wie sich herausstellte, beruhte die Suche nach Informationen zu provisories auf der Antwort auf MM . em>, während der richtige C-Ausdruck für dieses bestimmte Initialisierungskonstrukt zusammengesetztes Literal ist.

1 Ich würde es wirklich "die große Cross-Plattform drei" nennen, in Anlehnung an MSVC, aber eigentlich meine ich nur "die C-Compiler, die godbolt unterstützt".

    
BeeOnRope 29.01.2017, 23:38
quelle

1 Antwort

7

(point_t){1, 2} ist kein "temporäres". Es ist ein zusammengesetztes Literal. (Die gleiche Sequenz von Token in C ++ hat eine andere Bedeutung, diese beiden Sprachen sollten nicht miteinander verwechselt werden).

Ein zusammengesetztes Literal ist ein L-Wert, daher ist es legal, den unären Operator & zu verwenden. Die Speicherdauer wird durch C11 6.5.2.5/5 abgedeckt:

  

Wenn das zusammengesetzte Literal außerhalb des Körpers einer Funktion auftritt, das Objekt   hat statische Speicherdauer; Andernfalls hat es eine automatische Speicherdauer, die dem umschließenden Block zugeordnet ist.

Dieser Code ist also korrekt, und das zusammengesetzte Literal bleibt bis zum Ende der Funktion bestehen, in der es deklariert wurde.

    
M.M 30.01.2017, 01:06
quelle