static_assert

在编译时测试软件断言。 如果指定的常量表达式是 false,编译器显示指定的消息,并且生成失败并显示错误;否则,声明不起作用。

static_assert( 
    constant-expression, 
    string-literal 
);

参数

Parameter

说明

constant-expression

可以转换为布尔值的整型常数表达式。

如果该计算的表达式为零 (错误), string-literal 参数突出显示,然后生成失败并显示错误。 如果表达式是非零 (true), static_assert 声明不起作用。

string-literal

显示的消息,如果 constant-expression 参数为零。 消息是字符串在编译器的 基本字符集 的;即不是 多字节或宽字符

备注

static_assert 声明的 constant-expression 参数表示 软件断言。 软件断言指定在程序需要为 true 在特定位置的情况。 如果条件为 true, static_assert 声明不起作用。 如果条件为 false,则断言失败,编译器显示在 string-literal 参数的消息,并且,生成失败并显示错误。

static_assert 声明在编译时测试软件断言。 相反, assert (CRT) 宏测试软件断言在运行时并不会空格或时的运行时成本。 ,因为模板参数在 constant-expression 参数,可以包括 static_assert 声明为调试模板尤其有用。

,在图例中遇到时,编译器将检查语法错误的 static_assert 说明。 ,如果它不依赖于模板参数,编译器立即计算 constant-expression 参数。 否则,那么,当对模板进行实例化时,编译器将计算 constant-expression 参数。 因此,编译器可能一次问题一个诊断消息,在图例中遇到时,因此,同样,在对模板进行实例化。

可以使用 static_assert 关键字在命名空间中,类或块范围。 ( static_assert 关键字技术上是声明,因此,即使它不引入新名称传递给过程,,因为它可以在命名空间范围。)

说明

在下面的示例中, static_assert 声明包含命名空间范围。 由于编译器知道类型 void *的大小,该表达式立即计算。

示例

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

说明

在下面的示例中, static_assert 声明包含类范围。 static_assert 验证模板参数是一个纯旧数据类型 (POD)。 编译器将检查 static_assert 说明,在声明它时,但是,不计算 constant-expression 参数,直到 basic_string 类模板在 main()实例化。

示例

#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;
}

说明

在下面的示例中, 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.");
    // ...
    }
// ...
};

请参见

参考

断言以及用户提供的消息(C++)

#error指令(c/C++)

assert (CRT)

ASCII字符集

声明

其他资源

模板