C++
static_assert
サーチ…
構文
- static_assert( bool_constexpr 、 message )
- static_assert( bool_constexpr )/ * C ++以降17 * /
パラメーター
パラメータ | 詳細 |
---|---|
bool_constexpr | チェックする式 |
メッセージ | bool_constexprがfalseのときに印刷するメッセージ |
備考
ランタイムアサーションとは異なり、静的アサーションはコンパイル時にチェックされ、最適化されたビルドをコンパイルするときにも強制されます。
static_assert
アサーションとは、条件をチェックする必要があり、falseの場合はエラーです。 static_assert()
場合、これはコンパイル時に行われます。
template<typename T>
T mul10(const T t)
{
static_assert( std::is_integral<T>::value, "mul10() only works for integral types" );
return (t << 3) + (t << 1);
}
static_assert()
には必須の最初のパラメータ、条件、つまりboolのconstexprがあります。これは、二番目のパラメータ、文字列リテラルであるメッセージを、持っているかもしれません 。 C ++ 17から、2番目のパラメータはオプションです。その前に、それは必須です。
C ++ 17
template<typename T>
T mul10(const T t)
{
static_assert(std::is_integral<T>::value);
return (t << 3) + (t << 1);
}
次の場合に使用されます。
- 一般に、コンパイル時の検証は、ある種のconstexpr値で必要とされます
- テンプレート関数は、渡された型の特定のプロパティを検証する必要があります
- 次のようなテストケースを記述したいと考えています。
- テンプレートメタ関数
- constexpr関数
- マクロメタプログラミング
- 特定の定義が必要(例:C ++バージョン)
- レガシーコードの移植、
sizeof(T)
アサーション(32ビットintなど) - プログラムが動作するためには、特定のコンパイラ機能が必要です(パッキング、空の基本クラス最適化など)
static_assert()
はSFINAEには参加しないことに注意してください。追加のオーバーロード/特殊化が可能な場合、テンプレートメタプログラミング技術( std::enable_if<>
)の代わりに使用するべきではありません。予想されるオーバーロード/特殊化がすでに検出されているときにテンプレートコードで使用される可能性がありますが、それ以上の検証が必要です。このような場合、SFINAEに依存するよりも具体的なエラーメッセージが表示されることがあります。
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow