Итак, допустим, у меня есть массив:
int a[3] = { 1, 2, 3 };
Теперь, если бы я должен был проверить тип 'a' на моем машина, которую я получаю:
cout<<typeid(a).name(); // prints 'A3_i'
Теперь, если я возьму адрес 'a', затем разыменую этот адрес, тип не изменится (что мне очень нравится, потому что, по моему мнению, 'взятие адреса' и 'разыменование' являются обратными операциями ):
cout<<typeid(*&a).name(); // also prints 'A3_i'
Однако, если я сначала разыменую 'a', а затем возьму адрес этого, тип изменится (что, я признаю, мне не нравится, потому что, когда я разыменовал массив, я должен получить int, и когда я возьму адрес этого int, я должен получить указатель на int, и оказалось, что да):
cout<<typeid(&*a).name(); // prints 'Pi'
Итак, вот мои два вопроса:
1) Как только Тип-массив распался на тип-указатель, есть ли способ вернуть его к типу-массиву?
Я попробовал очевидную стратегию преобразования типа «ты просто-наплевать»:
cout<<typeid( (int[3]) &*a).name(); // does not compile
// "error: ISO C++ forbids casting to an array type `int [3]'"
Есть ли другой состав, который подойдет? Или этот тип преобразования строго запрещен?
2) Сможете ли вы когда-нибудь вернуться к типу массива, какая именно информация нарезается и теряется в процессе преобразования в указатель?
Я понимаю, что тип указателя и тип массива не эквивалентны. Я предполагаю, что тип-массив - это строгий надмножество информации, хранящейся в типе указателя. Звучит правильно?
В других вопросах я читал, что дополнительная информация в типе массива: знание того, находится ли массив в стеке, а также его размер (он должен знать размер массива как-то, потому что это часть типа, правда?). Есть ли какая-либо другая информация, скрытая в типе массива?