1. ホーム
  2. c++

[解決済み] static_assertは何をするものですか、そしてあなたは何に使いますか?

2022-07-09 10:39:09

質問

例として static_assert(...) ('C++11') が手元の問題をエレガントに解決するような例を教えてください。

私はランタイムに精通している assert(...) . どのような場合に static_assert(...) よりも、通常の assert(...) ?

また boost というものがあり BOOST_STATIC_ASSERT と同じなのでしょうか? static_assert(...) ?

どのように解決するのですか?

Static assertは、コンパイル時にアサーションを行うために使用されます。静的アサーションが失敗した場合、プログラムは単にコンパイルされません。これは様々な場面で役に立ちます。例えば、ある機能を実装する際に unsigned int オブジェクトが正確に 32 ビットであることに決定的に依存するコードによって、 ある機能を実装する場合などです。次のようにスタティックアサートを記述することができます。

static_assert(sizeof(unsigned int) * CHAR_BIT == 32);

をコードに追加してください。別のプラットフォームで、異なるサイズの unsigned int の型が異なる場合、コンパイルは失敗します。そのため、開発者はコードの問題のある部分に注意を払い、再実装または再調査するように助言されます。

別の例として、ある積分値を void * として関数に渡したい場合 (ハックですが、時には便利です)、積分値がポインタに収まるかどうかを確認したい場合があります。

int i;

static_assert(sizeof(void *) >= sizeof i);
foo((void *) i);

をアセットしたいかもしれません。 char タイプは署名されています。

static_assert(CHAR_MIN < 0);

あるいは、負の値との積分ではゼロになる。

static_assert(-5 / 2 == -2);

といった具合に。

多くの場合、静的アサーションの代わりに実行時アサーションを使用することができますが、実行時アサーションは実行時にしか動作せず、アサーションに制御が移るときだけ動作します。このため、失敗した実行時アサーションは、長期間にわたって検出されずに眠っている可能性があります。

もちろん、静的アサーションの式は、コンパイル時の定数でなければなりません。実行時の値にはできません。実行時の値については、通常の assert .