noexcept指定函数不抛出的条件

时间:2012-06-06 01:54:24

标签: c++ c++11 noexcept gcc4.7

我在绕过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;时才会抛出异常。我这样做了吗?

感谢任何帮助,我希望我正确解释。只是一些简单的解释会很棒。

1 个答案:

答案 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 ++ 中完成。也就是说,根据运行时参数指定函数是否抛出。