static_assert:
这个宏用于检测和诊断编译时错误。编译期,这是一个与 CRT-assert(运行时宏)相反的宏。这个好东西用于检测编译时程序的不变量。
这需要一个表达式可以被计算为 bool 或 string (字符串)。如果这个表达式的值为 false ,那么编译器会出现一个包含特定字符串的错误,同时编译失败。如果为 true 那么没有任何影响。
我们可以在以下使用 static_assert
A. namespace / global scope
- static_assert(sizeof(void*) == 4,"not supported");
B.class scope
- template<class T, int _n>
-
- class MyVec
- {
- static_assert( _n > 0 , "How the hell the size of a vector be negative");
- };
-
- void main()
- {
- MyVec<int, -2> Vec_;
-
-
-
-
-
-
-
-
-
-
-
- MyVec<int, 100> Vec_;
- }
C. block scope:
- template<typename T, int div>
- void Divide( )
- {
- static_assert(div!=0, "Bad arguments.....leading to division by zero");
- }
-
- void main()
- {
- Divide<int,0> ();
-
-
- }
请记住,static_asset 是在编译时执行的,不能用于检测运行时的值,向下面函数的参数。
- void Divide(int a, int b)
- {
- static_assert(b==0, “Bad arguments.....leading to division by zero”);
-
- }
static_assert 这个声明对于模板的调试非常有用,编译器快速执行这个常量表示式参数(不能依赖模板参数)。否则编译器当模板实例化时执行这个常量表达式的参数。