我在绕过noexcept时遇到了一些麻烦。
template <int SIZE>
int pop(int idx) noexcept(noexcept(SIZE > 0)) // this is what I dont understand
{
if (idx <= 0)
throw std::out_of_range("My array doesnt go that high");
return idx;
}
这只是一个简单的函数,但你看到它只是在idx&lt; = 0时抛出异常,我不明白。所以在我的规范中,noexcept(idx> 0),我试图告诉compilier这个函数只有在idx&gt;时才会抛出异常。我这样做了吗?
感谢任何帮助,我希望我正确解释。只是一些简单的解释会很棒。
答案 0 :(得分:4)
实际上noexept
规范需要常量表达式,而不是运行时表达式。您已将noexcept
specificatiom 与noexcept
运算符一起使用。 noexcept(idx >0)
返回true
,因为比较两个整数没有抛出,并且您使用true
作为noexcept
规范的参数告诉编译器你的功能永远不会抛出。声明
int pop(int idx) noexcept(noexcept(idx > 0))
表示只要idx > 0
没有抛出此函数就不会抛出,{em>始终就是int
的情况。
更新:现在您已更改了问题中的代码,以便idx
是非类型模板参数,但同样的推理也适用。比较int
s 永不抛出。
您似乎想要做的事情无法在 C ++ 中完成。也就是说,根据运行时参数指定函数是否抛出。