在静态断言出现前只有运行断言可以使用,运行时断言只能在编译器DeBug模式下运行时运行到断言处才会生效,如果想要在模板实例化的时候对模板实参进行约束的话运行时断言是无法实现的。
运行时断言实例
char* get_val(int size){
assert(size>0);
return new char[size];
}
C++11引入了静态断言static_assert
静态断言
- 静态断言用于在程序编译阶段评估常量表达式并对返回false的表达式断言
- 对静态断言的要求
-
- 所有处理必须在编译期间执行,不允许有空间或时间上的运行时成本
-
- 它必具有简单的语法
-
- 断言失败可以显示丰富的错误诊断信息
-
- 它可以在命名空间,类或代码块内使用
-
- 失败的断言在编译阶段报错
static_assert用法
第一个参数必须是常量表达式需要在编译阶段得到结果,第二个参数是错误信息
template<class T>
void fun(T){
static_assert(sizeof(T)>1,"参数是空类")
}
struct A{}
int main(){
std::cout<<"编译结束"<<std::endl;
fun(A());//编译阶段抛出异常
}
单参数static_assert
- C++17之前借助宏实现
#define my_static_assert(B) static_assert(B,#B)
- C++17支持单参数static_assert
static_assert(sizeof(void*)==4);