什么时候相对于模板实例化而评估static_assert

时间:2013-11-12 23:47:17

标签: c++ c++11

我有一个模板函数来操作递归数据结构。在调用的初始函数中,我有一些形式:

template <unsigned Pos, typename... Ps>
auto get(param<Ps...> i) -> int
{
    static_assert(Pos < sizeof...(Ps), "Error message");
    return helper<Pos>(i.rest);
}

在我正在玩的特定情况下,我知道helper<Pos>(i.rest)将无法编译,因为它试图超越数据结构的末尾。

我希望static_assert能够停止编译,但是在检查static_assert之前,它似乎实例化了模板并失败了。什么是实际正确的行为?

我正在使用GCC 4.7.3。

2 个答案:

答案 0 :(得分:1)

对于static_assert s相对于模板实例化的评估顺序,不存在这样的事情。标准只是说,如果static_assert的第一个参数中的表达式在编译时计算为false,则程序格式错误,诊断应包括第二个参数中的文本。

换句话说,static_assert(false)被视为语法错误或任何其他违反良构性约束的行为。当然,如果有多个错误导致程序格式错误,则标准不会指定编译器为其发出诊断的顺序,甚至也不应该为每个错误发出消息。

答案 1 :(得分:0)

对于@Igor的答案我可以补充一点,GCC编译器的第一遍就好像你只有函数声明,而不是定义。因此它可以在不查看函数体的情况下实例化一些代码。如果在这个级别出现问题,它可能不会深入内部。