C ++ 11 constexpr関数では、anなどの2番目のステートメントassert()
は使用できません。A static_assert()
は問題ありませんが、関数が「通常の」関数として呼び出された場合は機能しません。カンマ演算子はwrtoを助けるために来るかもしれません。assert()
しかし、醜いですし、いくつかのツールは、それについての警告を吐きます。
アサーションのほかに完全に制約可能な「ゲッター」を検討してください。しかし、実行時とコンパイル時に何らかのアサーションを保持したいのですが、 'constexpr'コンテキストによってはオーバーロードすることはできません。
template<int Size>
struct Array {
int m_vals[Size];
constexpr const int& getElement( int idx ) const
{
ASSERT( idx < Size ); // a no-go for constexpr funcs in c++11
// not possible, even in constexpr calls as being pointed out, but what I would like:
static_assert( idx < Size, "out-of-bounds" );
return m_vals[idx];
}
};
サイドコンディション:C ++ 11、ヒープ、例外、コンパイラーの詳細なし。
注コメンターは(感謝!)を指摘したように、static_assert
引数では不可能である(しかし、いいだろう)。コンパイラーは、その状況での境界外のアクセスに関して別のエラーを私に与えました。
static_assert
依存をまったく使用できませんidx
。idx
定数式を必要としない構成の評価を強制することにより、定数式を必要とするコンテキストで関数が使用されている場合にのみ、誤った値を診断できます。このようなコンテキスト外では、コンパイル時に値を確認することはできません。