代码之家  ›  专栏  ›  技术社区  ›  Barry

STD:不完全型:MAP和STD::变异型

  •  14
  • Barry  · 技术社区  · 7 年前

    考虑到递归变量在 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<...>> .

    简单地制造 递归标记 完成(即通过添加 {} )解决了问题。但问题的起因是什么呢?

    1 回复  |  直到 7 年前
        1
  •  14
  •   T.C. Yksisarvinen    7 年前

    这个 line at issue 电话

    std::_Destroy(std::__addressof(__get<_Np>(__v)));
    

    执行ADL的需要 __get 足以触发类型为的任何和所有关联类的实例化 __v ,即, _Variant ,以查找在这些类中定义的具有该名称的潜在友元函数(和函数模板)。包括 pair 你被绊倒了。