Я не могу себе представить, что это уже не дублируется, но я не могу легко найти ответ, поскольку более сложные сценарии, относящиеся конкретно к C++, похоже, преобладают в обсуждении0.
Законно ли взять адрес временной конструкции в списке параметров вызова функции в C99?
Например, что-то вроде init_list
или init_desig_init
следующим образом:
typedef struct {
int x;
int y;
} point_t;
int manhattan(point_t *p) {
return p->x + p->y;
}
int init_list() {
return manhattan(&(point_t){1, 2});
}
int init_desig_init() {
return manhattan(&(point_t){.x = 1});
}
Большая тройка1 похоже, компилирует его нормально, но на самом деле я не мог найдите ссылку, объясняющую, что время жизни временного объекта будет продлено, по крайней мере, за счет вызова функции.
0 Как оказалось, судя по ответу M.M ниже, часть моих проблем с поиском была связана с тем, что я искал информацию о временных файлах, в то время как правильным термином C для этой конкретной конструкции инициализации является составной литерал.
1 На самом деле я должен назвать это "большой кросс-платформенной тройкой" из уважения к MSVC, но на самом деле я просто имею в виду "компиляторы C, которые поддерживает godbolt".