0

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

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。

4

2 回答 2

2

static_assert不存在s 相对于模板实例化的求值顺序。该标准简单地说,如果第一个参数中的表达式在static_assert编译时计算为 false,则程序格式错误,诊断应包含来自第二个参数的文本。

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

于 2013-11-13T00:28:25.243 回答
0

对于@Igor 的答案,我可以补充一点,GCC 编译器的第一遍就好像你只有函数声明,而不是定义。所以它可能会在不查看函数体的情况下实例化一些代码。如果某件事在这个层面上失败了,它可能不会深入到内部。

于 2013-11-13T01:33:45.647 回答