我已经使用hana:tuple_t
来存储和检索类型列表:
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
上面的代码可以正常工作,但是当我尝试用其实际表达式替换变量first_t
时:
static_assert(std::is_same_v<decltype(Types[hana::int_c<0>])::type, int>); //line 4
我收到一个编译错误:
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
上面代码的第3行和第4行是等效的,我怎么会得到第4行的编译错误:
答案 0 :(得分:1)
decltype(Types[hana::int_c<0>])
是对const
的{{1}}引用,您不能查询引用来从引用中获取boost::hana::type_impl<int>::_
< em> d 类型。
::type
仅用first_t
声明,并且删除了引用和常量。如果您想保留它(在其他情况下),可以声明为auto
。
auto & first_t = ...
您可以使用static_assert(std::is_same_v<decltype(first_t), boost::hana::type_impl<int>::_>);
摆脱引用。
std::decay_t