hana::second 无法推断类型

hana::second can't deduce type

我正在尝试使用 hana::second...

从一对访问 hana::type
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 的结果不是预期的 return 所包含的 hana::type

错误消息指出 decltype 正在评估 boost::hana::type_impl<Foo>::_&,虽然看起来有点神秘,但您可以通过末尾的 & 看出它是 引用 到包含的 hana::type。不幸的是,该引用将不包含您希望在原始类型中找到的成员。

为此 hana::type 提供了一个一元 operator+,它只是取消对原始类型的引用,因此您可以执行以下操作:

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

hana::typeid_ 适用于此,并且它幂等地将任何值包装在 hana::type 中,并去除 const 和引用限定符:

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

值得注意的是,以下所有 Hana 函数 return 参考资料:

firstsecondatat_key 以及关联的 operator[].