static_assert
コンパイル時にソフトウェアのアサーションをテストします。定数式を指定 false 場合コンパイラは指定されたメッセージを表示しコンパイルはエラーで失敗します ; は宣言は無効です。
static_assert(
constant-expression,
string-literal
);
パラメーター
パラメーター |
Description |
---|---|
constant-expression |
ブール値に変換できる整数定数式。 評価される式がゼロ (False) の場合string-literal のパラメーターが表示されコンパイルはエラーで失敗します。式がゼロ以外 (true) の場合static_assert の宣言は無効です。 |
string-literal |
constant-expression のパラメーターがゼロの場合に表示するメッセージ。メッセージがコンパイラの 基本文字セット の文字列である ; つまりマルチバイト文字またはワイド。 |
解説
static_assert の宣言の constant-expression のパラメーターは ソフトウェアのアサーションを 表します。ソフトウェアのアサーションはプログラムの特定位置にある true となる条件を指定します。条件が true の場合static_assert の宣言は無効です。条件が false の場合アサーションは失敗しstring-literal のパラメーターにメッセージを表示しコンパイルはエラーで失敗します。
static_assert の宣言はコンパイル時にソフトウェアのアサーションをテストします。これに対しassert (CRT) のマクロが実行時にソフトウェアのアサーションをテストする場合はスペースまたはタイムアウトの時間が増えることが必要です。static_assert の宣言ではテンプレートの引数が constant-expression のパラメーターに含めることができるためテンプレートをデバッグする場合に特に役立ちます。
コンパイラは宣言構文エラーが発生したときの static_assert の宣言を確認します。コンパイラはテンプレート パラメーターに依存する constant-expression のパラメーターを直ちに評価します。それ以外の場合コンパイラはテンプレートをインスタンス化するときに constant-expression のパラメーターを評価します。その結果コンパイラはテンプレートがインスタンス化されるとき再宣言がある場合診断メッセージが生成されることがあります。
名前空間クラスまたはブロック スコープで static_assert のキーワードを使用します。(static_assert のキーワードは名前空間スコープで使用できるためプログラムに新しい名前を組込まないが技術的に宣言です)。
Description
次の例ではstatic_assert の宣言に名前空間スコープがあります。コンパイラが型 void * のサイズがわかっているので式は直ちに評価されます。
例
static_assert(sizeof(void *) == 4, "64-bit code generation is not supported.");
Description
次の例ではstatic_assert の宣言にクラス スコープがあります。static_assertテンプレート パラメーターを plain old data 型 (POD) であることを確認します。コンパイラは basic_string のクラス テンプレートが main() でインスタンス化されるまで宣言されているがチェックしconstant-expression のパラメーターを評価できない場合 static_assert の宣言を示します。
例
#include <type_traits>
#include <iosfwd>
namespace std {
template <class CharT, class Traits = std::char_traits<CharT> >
class basic_string {
static_assert(tr1::is_pod<CharT>::value,
"Template argument CharT must be a POD type in class template basic_string");
// ...
};
}
struct NonPOD {
NonPOD(const NonPOD &) {}
virtual ~NonPOD() {}
};
int main()
{
std::basic_string<char> bs;
}
Description
次の例ではstatic_assert の宣言にブロック スコープがあります。static_assert は VMPage の構造体のサイズがシステムの仮想メモリと同じ pagesize ことを確認します。
例
#include <sys/param.h> // defines PAGESIZE
class VMMClient {
public:
struct VMPage { // ...
};
int check_pagesize() {
static_assert(sizeof(VMPage) == PAGESIZE,
"Struct VMPage must be the same size as a system virtual memory page.");
// ...
}
// ...
};