我有一个模板函数来操作递归数据结构。在调用的初始函数中,我有一些形式:
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。
答案 0 :(得分:1)
对于static_assert
s相对于模板实例化的评估顺序,不存在这样的事情。标准只是说,如果static_assert
的第一个参数中的表达式在编译时计算为false,则程序格式错误,诊断应包括第二个参数中的文本。
换句话说,static_assert(false)
被视为语法错误或任何其他违反良构性约束的行为。当然,如果有多个错误导致程序格式错误,则标准不会指定编译器为其发出诊断的顺序,甚至也不应该为每个错误发出消息。
答案 1 :(得分:0)
对于@Igor的答案我可以补充一点,GCC编译器的第一遍就好像你只有函数声明,而不是定义。因此它可以在不查看函数体的情况下实例化一些代码。如果在这个级别出现问题,它可能不会深入内部。