hana::second не может вывести тип

Я пытаюсь получить доступ к hana::type из пары, использующей hana::second...

namespace hana = boost::hana;
using namespace hana::literals;

struct Key {};
struct Foo {};

int main() {

  auto test = hana::make_tuple(
      hana::make_pair(
        hana::type_c<Key>, 
        hana::type_c<Foo>));

  typename decltype(hana::type_c<Foo>)::type  finalTest; //Ok
  typename decltype(hana::second(test[0_c]))::type finalTest2; //Error
}

Но я получаю следующую ошибку компилятора:

stacktest.cpp: In function ‘int main()’:
stacktest.cpp:17:12: error: decltype evaluates to ‘boost::hana::type_impl<Foo>::_&’, which is not a class or enumeration type
   typename decltype(hana::second(test[0_c]))::type finalTest2;

Почему результат hana::second не вернуть содержимое hana::type как и ожидалось?

1 ответ

Решение

Сообщение об ошибке гласит, что decltype оценивается как boost::hana::type_impl<Foo>::_&который немного загадочно выглядит, вы можете увидеть по & в конце концов, это ссылка на содержащийся hana::type, К сожалению, ссылка не будет содержать членов, которые вы ожидаете найти в необработанном виде.

За это hana::type обеспечивает одинарный operator+ это просто разыменовывает необработанный тип, так что вы можете сделать следующее:

typename decltype(+hana::second(test[0_c]))::type finalTest2;

hana::typeid_ работает для этого, а также идемпотентно оборачивает любое значение в hana::type с константными и референсными классификаторами:

typename decltype(hana::typeid_(hana::second(test[0_c])))::type finalTest2;

Стоит отметить, что все следующие функции Hana возвращают ссылки:

first, second, at, at_keyи связанные operator[],

Другие вопросы по тегам