どのようにして適切にstatic_assert
constexpr
関数内?例えば:
constexpr int do_something(int x)
{
static_assert(x > 0, "x must be > 0");
return x + 5;
}
Constexpr関数にはreturnステートメントのみを含める必要があるため、これは有効なC++ 11コードではありません。 GCC 4.7ではこのコードをコンパイルすることはできませんが、標準にこれに対する例外があるとは思いません。
Constexpr関数にはreturnステートメントのみを含める必要があるため、これは有効なC++ 11コードではありません。
これは誤りです。 static_assert
constexpr
関数で問題ありません。 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状態
...または以下のみを含む複合ステートメント