GCC匿名是未初始化的

问题描述 投票:0回答:1

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

我的问题是虽然下面显示的实现在msvc上工作正常,但是clang和icc ConstExprList::Get总是在gcc(trunk版本)上返回0。

如果在启用了-Wall -Werror选项的情况下编译代码,gcc会抛出以下错误:

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

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

这是gcc实现中的错误还是遗漏了什么?

#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>();
}
c++ gcc compiler-errors variadic-templates compiler-flags
1个回答
4
投票

该警告具有误导性,但指出了一个真正的问题。 m_head是初始化为临时的参考。这不是导致临时生命延长的上下文之一,因此您的引用会悬空。

© www.soinside.com 2019 - 2024. All rights reserved.