サーチ…


構文

  • static_assert( bool_constexprmessage
  • static_assert( bool_constexpr )/ * C ++以降17 * /

パラメーター

パラメータ詳細
bool_constexpr チェックする式
メッセージ bool_constexprfalseのときに印刷するメッセージ

備考

ランタイムアサーションとは異なり、静的アサーションはコンパイル時にチェックされ、最適化されたビルドをコンパイルするときにも強制されます。

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