Адрес массива 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};
Другие вопросы по тегам