Могу ли я обратить вспять процесс распада массива на указатель? - PullRequest
4 голосов
/ 26 декабря 2011

Разрешено ли приводить указатель на первый элемент массива к указателю на весь массив?

template<typename T, size_t N>
void whatever(T(&)[N])
{
    std::cout << N << '\n';
}

int main()
{
    int a[10];
    int * p = a;
    whatever(*(int(*)[10])(p));   // <-- legal?
}

Это выводит 10 на моем компиляторе, но я не уверен, что C ++стандарт это позволяет.

Ответы [ 2 ]

2 голосов
/ 26 декабря 2011

Нет, это не законно (как и в случае неопределенного поведения). Указатель на весь массив - &a, а не p. По сути, вы приводите один указатель к другому. Стандарт описывает все разрешенные преобразования, и это не входит в их число.

0 голосов
/ 26 декабря 2011

Я помню, что пришел к выводу, что

  • преобразует указатель на первый элемент POD-структуры в указатель на POD-структуру
  • , преобразует указатель на один элементмассив в указатель на массив достаточно малого размера

хорошо определен.Но если первый вывод был довольно прямым (т. Е. В стандарте был раздел, говорящий об этом довольно простыми словами), то второй сделал несколько шагов (т. Е. Вам нужно было собрать несколько частей стандарта и сделать вывод), и я 'У нас нет времени, чтобы повторить поиск сейчас.Если никто не дает цитаты тем или иным образом, я постараюсь вернуться позже с некоторыми.

Редактировать: Я не нашел мои рассуждения назад.В настоящее время все, что я имею в виду, что в предположении, что reinterpret_cast дает тот же результат, что и распад массива, обратное путешествие от «указателя к массиву» до «указателя на первый элемент» до «указателя на массив» гарантируется (согласно 5.2.10 / 7 в C ++ 98), поскольку требование выравнивания для массива не может быть менее строгим, чем требование выравнивания для элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...