为什么总是调用`static_assert`?

时间:2015-01-02 07:37:33

标签: c++ c++11 static-assert

如果USE_STATIC_ASSERT0,则按预期工作(从列表中获取索引类型)。如果为1 static_assert()总是被触发。我原以为static_assert()只有在所有typename都用完之后才会发生。为什么不是这样呢?

#define USE_STATIC_ASSERT 1
template <unsigned int I, typename ...Ts>
struct items;

template <typename T, typename ...Ts>
struct items<0, T, Ts...>
{
    typedef T type;
};

template <unsigned int I, typename T, typename ...Ts>
struct items<I, T, Ts...> : items<I-1, Ts...>
{
};

#if USE_STATIC_ASSERT
template <unsigned int I>
struct items<I>
{
    static_assert(false, "Ran out of Ts.");
};
#endif


int main()
{
    cout << is_same<float, items<1, int, float, double>::type>::value << endl;
}

1 个答案:

答案 0 :(得分:5)

即使未实例化包含items的{​​{1}}的部分特化,也允许编译器根据§14.6[temp.res] / p8拒绝此代码:

  

知道哪些名称是类型名称允许检查每个模板的语法。没有诊断   应为可以生成有效专业化的模板颁发。 如果无法为模板生成有效的专业化,并且未实例化该模板,则模板格式错误,无需诊断。

要解决此问题,您可以使static_assert中的表达式依赖于其他类模板:

static_assert