Итак, скажем, у меня есть массив:
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) Можете ли вы когда-нибудь вернуться к типу массива, точно, какая информация нарезана и потеряна в процессе разложения на указатель?
Я понимаю, что тип указателя и тип массива не эквивалентны. Я предполагаю, что тип массива является строгим надмножеством информации, хранящейся в типе указателя. Правильно ли это звучит?
Я читал в других вопросах, что дополнительная информация в массиве-типа: знание того, находится ли массив в стеке, а также его размер (он должен каким-то образом знать размер массива, поскольку он часть типа, правильно?). Есть ли какая-либо другая информация, скрытая в массиве?