Адрес массива prvalue
Я не понимаю, почему это не работает:
auto a = (int[]){1, 2, 3, 4, 5};
> error: taking address of temporary array
Я понимаю, что массивы lvalue распадаются на указатели при преобразовании в rvalue, но здесь массив уже является rvalue (фактически prvalue), поэтому никакого распада не требуется. Я бы ожидал a
выводиться и инициализироваться int[5]
, Почему он пытается получить временный адрес?
1 ответ
Я бы ожидал
a
выводиться и инициализироватьсяint[5]
К сожалению, это не так, как работают массивы C. Массивы распадаются на указатели. Вы не можете действительно иметь "значение массива". Если вы замените auto на выведенный тип, это будет выглядеть так:
int* a = (int[]){1, 2, 3, 4, 5};
Распад должен взять адрес, чтобы сделать указатель.
Это легко исправить с помощью ссылок, поскольку ссылка на временные ссылки увеличивает срок их службы:
auto&& a = (int[]){1, 2, 3, 4, 5}; // works!
Вот пример, работающий на проводнике компилятора.
Конечно, с std::array
вы получаете хороший синтаксис и семантику значений:
auto a = std::array{1, 2, 3, 4, 5};