代码之家  ›  专栏  ›  技术社区  ›  Petok Lorand

GCC匿名未初始化

  •  0
  • Petok Lorand  · 技术社区  · 6 年前

    我正在尝试创建类似于 std::tuple ,一种使用可变模板和递归继承的编译时列表,如下面的实现所示。

    我的问题是,尽管下面所示的实现在MSVC、Clang和ICC上运行良好 ConstExprList::Get 总是在gcc(主干版本)上返回0。

    如果在启用-wall-werror选项的情况下编译代码,gcc将引发以下错误:

    anonymous is used uninitialized in this function [-Werror=uninitialized] .

    请注意,如果禁用优化,则不会发生错误。

    这是GCC实现中的一个bug,还是遗漏了一些东西?

    #include <type_traits>
    
    template <typename... Args>
    class ConstExprList;
    
    template <typename Head, typename... Tail>
    class ConstExprList<Head, Tail...> : public ConstExprList<Tail...>
    {
    public:
        ConstExprList(const Head& head, const Tail&... tail) : ConstExprList<Tail...>(tail...),  m_head(head) {}
    
        template <std::size_t Idx>
        inline typename std::enable_if<Idx == 0, Head>::type Get(void) const noexcept
        {
            return m_head;
        }
    
        template <std::size_t Idx>
        inline typename std::enable_if<Idx != 0, Head>::type Get(void) const noexcept
        {
            return ConstExprList<Tail...>::template Get<Idx - 1>();
        }
    
    private:
        const Head& m_head;
    };
    
    template <typename Head>
    class ConstExprList<Head>
    {
    public:
        ConstExprList(const Head& head) : m_head(head) {}
    
        template <std::size_t Idx>
        inline auto Get(void) const noexcept
        {
            static_assert(Idx == 0, "Index out of range");
            return m_head;
        }
    
    private:
        const Head& m_head;
    };
    
    int main(void)
    {
        ConstExprList<int, int> l(7, 3);
    
        return l.Get<0>();
    }
    
    1 回复  |  直到 6 年前
        1
  •  4
  •   user743382    6 年前

    m_head