static_assertstatic_assert

コンパイル時にソフトウェアのアサーションをテストします。Tests a software assertion at compile time. 指定された定数式が FALSE の場合、指定したメッセージが指定されている場合はコンパイラによって表示され、コンパイルはエラー C2338 で失敗します。それ以外の場合、宣言は無効です。If the specified constant expression is FALSE, the compiler displays the specified message, if one is provided, and the compilation fails with error C2338; otherwise, the declaration has no effect.

構文Syntax

static_assert( constant-expression, string-literal );

static_assert( constant-expression ); // C++17 (Visual Studio 2017 and later)

パラメーターParameters

パラメーターParameter 説明Description
constant-expressionconstant-expression ブール型に変換できる整数定数式。An integral constant expression that can be converted to a Boolean.

評価された式が 0 (false) の場合は、文字列リテラルパラメーターが表示され、コンパイルはエラーで失敗します。If the evaluated expression is zero (false), the string-literal parameter is displayed and the compilation fails with an error. 式が0以外 (true) の場合、 static_assert宣言は無効です。If the expression is nonzero (true), the static_assert declaration has no effect.
string-literalstring-literal 定数式のパラメーターが0の場合に表示されるメッセージ。An message that is displayed if the constant-expression parameter is zero. メッセージは、コンパイラの基本文字セット内の文字の文字列です。つまり、マルチバイト文字またはワイド文字ではありません。The message is a string of characters in the base character set of the compiler; that is, not multibyte or wide characters.

RemarksRemarks

Static_assert宣言の定数式のパラメーターは、ソフトウェアのアサーションを表します。The constant-expression parameter of a static_assert declaration represents a software assertion. ソフトウェアのアサーションは、プログラムの特定位置にある true となるはずの条件を指定します。A software assertion specifies a condition that you expect to be true at a particular point in your program. 条件が true の場合、 static_assert宣言は無効です。If the condition is true, the static_assert declaration has no effect. 条件が false の場合、アサーションは失敗し、コンパイラは文字列リテラルパラメーターにメッセージを表示し、コンパイルはエラーで失敗します。If the condition is false, the assertion fails, the compiler displays the message in string-literal parameter, and the compilation fails with an error. Visual Studio 2017 以降では、文字列リテラルパラメーターは省略可能です。In Visual Studio 2017 and later, the string-literal parameter is optional.

Static_assert宣言は、コンパイル時にソフトウェアのアサーションをテストします。The static_assert declaration tests a software assertion at compile time. これに対し、 Assert マクロと _assert 関数および _wassert 関数は、実行時にソフトウェアアサーションをテストし、領域または時間で実行時のコストを発生させることになります。In contrast, the assert Macro and _assert and _wassert functions test a software assertion at run time and incur a run time cost in space or time. Static_assert宣言は、テンプレート引数を定数式パラメーターに含めることができるため、テンプレートをデバッグする場合に特に便利です。The static_assert declaration is especially useful for debugging templates because template arguments can be included in the constant-expression parameter.

コンパイラは、宣言が検出されたときに構文エラーのstatic_assert宣言を調べます。The compiler examines the static_assert declaration for syntax errors when the declaration is encountered. コンパイラは、テンプレートパラメーターに依存していない場合、定数式パラメーターを直ちに評価します。The compiler evaluates the constant-expression parameter immediately if it does not depend on a template parameter. それ以外の場合、コンパイラは、テンプレートがインスタンス化されるときに定数式パラメーターを評価します。Otherwise, the compiler evaluates the constant-expression parameter when the template is instantiated. その結果、コンパイラは、宣言を検出したときに一度、テンプレートがインスタンス化されたときに再度、診断メッセージを発行することがあります。Consequently, the compiler might issue a diagnostic message once when the declaration is encountered, and again when the template is instantiated.

Static_assertキーワードは、名前空間、クラス、またはブロックスコープで使用できます。You can use the static_assert keyword at namespace, class, or block scope. ( Static_assertキーワードは、プログラムに新しい名前が導入されていない場合でも、名前空間のスコープで使用できるため、技術的には宣言です)。(The static_assert keyword is technically a declaration, even though it does not introduce new name into your program, because it can be used at namespace scope.)

説明Description

次の例では、 static_assert宣言に名前空間スコープが含まれています。In the following example, the static_assert declaration has namespace scope. コンパイラは void * 型のサイズがわかっているので、式は直ちに評価されます。Because the compiler knows the size of type void *, the expression is evaluated immediately.

Example

static_assert(sizeof(void *) == 4, "64-bit code generation is not supported.");

説明Description

次の例では、 static_assert宣言にクラススコープが含まれています。In the following example, the static_assert declaration has class scope. Static_assertは、テンプレートパラメーターが、 plain old data (ポッド) 型であることを確認します。The static_assert verifies that a template parameter is a plain old data (POD) type. コンパイラは、宣言されているときにstatic_assert宣言を調べますが、でbasic_string main()クラステンプレートがインスタンス化されるまで、定数式のパラメーターは評価されません。The compiler examines the static_assert declaration when it is declared, but does not evaluate the constant-expression parameter until the basic_string class template is instantiated in main().

Example

#include <type_traits>
#include <iosfwd>
namespace std {
template <class CharT, class Traits = std::char_traits<CharT> >
class basic_string {
    static_assert(std::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宣言にブロックスコープが含まれています。In the following example, the static_assert declaration has block scope. Static_assertは、vmpage 構造のサイズがシステムの仮想メモリ pagesize と同じであることを確認します。The static_assert verifies that the size of the VMPage structure is equal to the virtual memory pagesize of the system.

Example

#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.");
    // ...
    }
// ...
};

関連項目See also

アサーションとユーザー指定のメッセージ (C++)Assertion and User-Supplied Messages (C++)
#error ディレクティブ (C/C++)#error Directive (C/C++)
assert マクロ、_assert、_wassertassert Macro, _assert, _wassert
[テンプレート]Templates
ASCII 文字セットASCII Character Set
宣言と定義Declarations and Definitions