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