1

I have using hana:tuple_t to store and retrieve a typelist:

auto Types = hana::tuple_t<int, double>;
auto first_t = Types[hana::int_c<0>];
static_assert(std::is_same_v<decltype(first_t)::type, int>); // line 3

The above code, works correctly, however when I tried to replace the variable first_t by its actual expression:

static_assert(std::is_same_v<decltype(Types[hana::int_c<0>])::type, int>); //line 4

I get a compile error:

template argument 1 is invalid
     static_assert(std::is_same_v<decltype(Types[hana::int_c<0>])::type, int>);
 error: decltype evaluates to ‘const boost::hana::type_impl<int>::_&’, which is not a class or enumeration type

Line 3 and Line 4 of the above code are equivalent, how come I get the compile error for line 4:

motam79
  • 3,542
  • 5
  • 34
  • 60

1 Answers1

1

decltype(Types[hana::int_c<0>]) is a const reference to boost::hana::type_impl<int>::_ and you cannot query a reference to get the ::type from the referenced type.

first_t is declared with just auto, and that removes the reference and the constness. If you wanted to keep that (in a different situation), you could declare it auto & first_t = ....

static_assert(std::is_same_v<decltype(first_t), boost::hana::type_impl<int>::_>);

You can use std::decay_t to get rid of the reference.

static_assert(std::is_same_v<
    std::decay_t<decltype(Types[hana::int_c<0>])>::type, int>);
palotasb
  • 4,108
  • 3
  • 24
  • 32