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 operatorと一緒に使用しました。2つの整数を比較してもスローされないため、それを仕様の引数として使用して、関数が決してスローしないことをコンパイラーに伝えていますnoexcept(idx >0)。宣言truetruenoexcept

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

は、この関数がスローしない限りスローしないことを示します。idx > 0これは、 の場合に常に当てはまりintます。

更新:これで、質問のコードが非型テンプレート引数になるように変更されましたidx同じ理由が適用されます。intsを比較しても はスローされません

あなたがしようとしているように見えることは、C++ では実行できません。つまり、実行時の引数に基づいて関数がスローするかどうかを指定します。

于 2012-06-06T01:56:34.933 に答える