3

我正在尝试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

4

1 回答 1

6

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

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

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

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

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

值得注意的是,以下所有 Hana 函数都返回引用:

first, second, at, at_key, 和相关联operator[]

于 2017-04-26T16:26:46.370 回答