考虑到递归变量在
std::variant
:
#include <map>
#include <variant>
struct recursive_tag;
template <typename...>
struct RecursiveVariant;
template <>
struct RecursiveVariant<int, std::map<int, recursive_tag>>
: std::variant<int, std::map<int, RecursiveVariant<int, std::map<int, recursive_tag>>>>
{
using underlying = std::variant<int,
std::map<int, RecursiveVariant<int, std::map<int, recursive_tag>>>>;
using underlying::underlying;
};
int main() {
RecursiveVariant<int, std::map<int, recursive_tag>> rv;
}
由于试图实例化,未能在GCC 7/8上编译
std::pair<const int, recursive_tag>
,但失败的原因是
recursive_tag
是不完整的类型。
但是,编译器错误调用堆栈中没有任何内容向我指出
为什么
需要实例化。最重要的是:
变型:252:48:要求自
void std::__detail::__variant::__erased_dtor(_Variant&&) [with _Variant = const std::__detail::__variant::_Variant_storage<false, int, std::map<int, RecursiveVariant<int, std::map<int, recursive_tag, std::less<int>, std::allocator<std::pair<const int, recursive_tag> > > >, std::less<int>, std::allocator<std::pair<const int, RecursiveVariant<int, std::map<int, recursive_tag, std::less<int>, std::allocator<std::pair<const int, recursive_tag> > > > > > > >&; long unsigned int _Np = 0]
艾斯
指向:
249 template<typename _Variant, size_t _Np>
250 void
251 __erased_dtor(_Variant&& __v)
252 { std::_Destroy(std::__addressof(__get<_Np>(__v))); }
while类型
map<int, recursive_tag>
在那里拼写,实际
map
应实例化的类型为
map<int, RecursiveVariant<int, map<int, recursive_tag>>>
…它只需要实例化
pair<const int, RecursiveVariant<...>>
.
简单地制造
递归标记
完成(即通过添加
{}
)解决了问题。但问题的起因是什么呢?