После того, как массив-T распался на указатель на-T, можно ли его снова превратить в массив-of-T?

Итак, допустим, у меня есть массив:

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) Сможете ли вы когда-нибудь вернуться к типу массива, какая именно информация нарезается и теряется в процессе преобразования в указатель?

Я понимаю, что тип указателя и тип массива не эквивалентны. Я предполагаю, что тип-массив - это строгий надмножество информации, хранящейся в типе указателя. Звучит правильно?

В других вопросах я читал, что дополнительная информация в типе массива: знание того, находится ли массив в стеке, а также его размер (он должен знать размер массива как-то, потому что это часть типа, правда?). Есть ли какая-либо другая информация, скрытая в типе массива?

14
задан Jimmy 27 July 2011 в 01:55
поделиться