Ответ 1
После проверки переменной через отладчик я обнаружил, что я прав - what_am_i
является размерным массивом [4][2]
.
Поскольку заголовок может выглядеть очень запутанным, позвольте мне привести вам пример:
typedef bool foo[2];
typedef foo bar[4];
bar what_am_i;
Итак, есть ли размерный массив what_am_i
a [4][2]
, или размерный массив [2][4]
?
После проверки переменной через отладчик я обнаружил, что я прав - what_am_i
является размерным массивом [4][2]
.
Это bool[4][2]
Вы можете проверить его static_assert:
static_assert(std::is_same<decltype(what_am_i), bool[4][2]>::value, "");
static_assert(std::is_same<decltype(what_am_i), bool[2][4]>::value, ""); // failed
foo
- массив с элементами 2
типа bool
, т.е. bool[2]
.
bar
- это массив с 4
элементами типа foo
, то есть foo[4]
, каждый элемент является bool[2]
.
Тогда what_am_i
есть bool[4][2]
.
Чтобы закончить ответ @Slardar Zhang С++ для C:
Это bool[4][2]
.
Вы можете проверить его одним из следующих способов:
sizeof(what_am_i)/sizeof(*what_am_i) == 4
sizeof(*what_am_i)/sizeof(**what_am_i) == 2
Если вы не знаете тип переменной, одним из простых способов является этот трюк:
template<class T> struct tag_type{using type=T;};
template<class T> constexpr tag_type<T> tag{};
то сделайте следующее:
tag_type<void> t = tag<some_type>;
почти каждый компилятор выплюнет разумно читаемый "вы не можете назначить tag_type<full_unpacked_type>
на tag_type<void>
" или somesuch (предположим, что ваш тип не void
).
Вы также можете проверить, что у вас есть хорошее предположение с
tag_type<your_guess> t = tag<some_type>;
иногда вам нужно сгенерировать some_type
через decltype(some_expression)
.