Подтвердить что ты не робот

Typedef массива typedefs массива

Поскольку заголовок может выглядеть очень запутанным, позвольте мне привести вам пример:

typedef bool foo[2];
typedef foo bar[4];
bar what_am_i;

Итак, есть ли размерный массив what_am_i a [4][2], или размерный массив [2][4]?

4b9b3361

Ответ 1

После проверки переменной через отладчик я обнаружил, что я прав - what_am_i является размерным массивом [4][2].

Ответ 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

Ответ 3

foo - массив с элементами 2 типа bool, т.е. bool[2].

bar - это массив с 4 элементами типа foo, то есть foo[4], каждый элемент является bool[2].

Тогда what_am_i есть bool[4][2].

Ответ 4

Чтобы закончить ответ @Slardar Zhang С++ для C:

Это bool[4][2].

Вы можете проверить его одним из следующих способов:

  • sizeof(what_am_i)/sizeof(*what_am_i) == 4
  • sizeof(*what_am_i)/sizeof(**what_am_i) == 2

Ответ 5

Если вы не знаете тип переменной, одним из простых способов является этот трюк:

 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).