0

我在处理 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 <= 0 时抛出异常的,我不明白。所以在我的规范中,noexcept(idx > 0),我试图告诉编译器这个函数只有在 idx > 0 时才抛出异常。我这样做对吗?

任何帮助表示赞赏,我希望我解释正确。只是一些简单的解释会很棒。

4

1 回答 1

4

实际上,noexept 规范需要一个常量表达式,而不是运行时表达式。您已将noexcept 规范noexcept 操作员一起使用。noexcept(idx >0)返回true比较两个整数不会抛出,并且您将其true用作noexcept 规范的参数,告诉编译器您的函数永远不会抛出。宣言

int pop(int idx) noexcept(noexcept(idx > 0))

表示这个函数只要不抛出idx > 0不会抛出,对于.int

更新:现在您已经更改了问题中的代码,使其idx成为非类型模板参数,但同样的推理也适用。比较ints永远不会抛出

您似乎试图做的事情无法在C++中完成。也就是说,根据其运行时参数指定函数是否抛出。

于 2012-06-06T01:56:34.933 回答