57

static_assert関数内でどのように適切に実行しconstexprますか?例えば:

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

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

4

2 に答える 2

64

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

これは正しくありません。関数内で問題ありませんstatic_assertうまくいかないconstexprのは、定数式で関数パラメーターを使用することです。

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

constexpr int do_something(int x) {
  return x > 0 ? (x + 5) : (throw std::logic_error("x must be > 0"));
}
于 2011-12-24T19:22:46.367 に答える
23

テンプレート引数はコンパイル時のみであるため、これは機能し、有効な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宣言とalias-declarations 、
  • using-宣言、
  • using-ディレクティブ、
  • そしてちょうど1つのreturnステートメント
于 2012-08-24T12:44:46.277 に答える