我正在尝试使用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
?
答案 0 :(得分:6)
错误消息指出decltype正在评估mvn deploy
,虽然看起来有点神秘,但最后boost::hana::type_impl<Foo>::_&
可以看到它是引用到包含的&
。遗憾的是,引用不包含您希望在原始类型中找到的成员。
为此hana::type
提供了一个一元hana::type
,它只是取消引用原始类型,因此您可以执行以下操作:
operator+
typename decltype(+hana::second(test[0_c]))::type finalTest2;
适用于此,并且它在幂hana::typeid_
中包含const和引用限定符的任意值:
hana::type
值得注意的是,以下所有Hana函数都返回引用:
typename decltype(hana::typeid_(hana::second(test[0_c])))::type finalTest2;
,first
,second
,at
以及关联的at_key
。