web-dev-qa-db-ja.com

C ++ 11-constexpr関数内のstatic_assert?

どのようにして適切にstatic_assertconstexpr関数内?例えば:

constexpr int do_something(int x)
{
  static_assert(x > 0, "x must be > 0");
  return x + 5;
}

Constexpr関数にはreturnステートメントのみを含める必要があるため、これは有効なC++ 11コードではありません。 GCC 4.7ではこのコードをコンパイルすることはできませんが、標準にこれに対する例外があるとは思いません。

54
RétroX

Constexpr関数にはreturnステートメントのみを含める必要があるため、これは有効なC++ 11コードではありません。

これは誤りです。 static_assertconstexpr関数で問題ありません。 notとは、定数式で関数パラメーターを使用するのと同じです。

x <= 0。定数式を必要とするコンテキストで関数を呼び出すと、コンパイルに失敗します

constexpr int do_something(int x) {
  return x > 0 ? (x + 5) : (throw std::logic_error("x must be > 0"));
}

テンプレート引数はコンパイル時のみなので、これは機能し、有効なC++ 11コードです。

template <int x>
constexpr int do_something() {
    static_assert(x > 0, "x must be > 0");
    return x + 5;
}

C++の定数式で行ったのと同じ問題に直面しました。現在、constexprsに関する明確なドキュメントはほとんどありません。また、gccの課題追跡には既知のバグがいくつかありますが、問題はバグではないようです。

クラス内でconstexpr関数を宣言すると、クラス内でそれらを使用できないことに注意してください。これもバグではないようです。

編集:これは標準に従って許可されています:7.1.3状態

...または以下のみを含む複合ステートメント

  • nullステートメント、
  • static_assert-declarations
  • typedef宣言とエイリアス宣言ではない
    クラスまたは列挙を定義し、
  • 使用宣言、
  • usingディレクティブ
  • そしてちょうど1つのreturnステートメント
23
cppist