Адрес массива prvalue - PullRequest
       25

Адрес массива prvalue

0 голосов
/ 14 февраля 2019

Я не понимаю, почему это не работает:

auto a = (int[]){1, 2, 3, 4, 5};

> error: taking address of temporary array

Я понимаю, что значения l массива распадаются на указатели при преобразовании в значения r, но здесь массив уже является значением rval (фактически, prvalue), поэтомуне должно быть никакого распада.Я ожидал, что a будет выведено и инициализировано до int[5].Почему он пытается взять временный адрес?

1 Ответ

0 голосов
/ 14 февраля 2019

Я бы ожидал, что 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};
...