Поскольку заголовок может выглядеть очень запутанным, позвольте мне привести вам пример:
typedef bool foo[2];
typedef foo bar[4];
bar what_am_i;
Итак, есть ли размерный массив what_am_i a [4][2], или размерный массив [2][4]?
Поскольку заголовок может выглядеть очень запутанным, позвольте мне привести вам пример:
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) == 4sizeof(*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).