进行编译时断言检查。
语法
static_assert ( 布尔常量表达式 , 消息 )
如果 布尔常量表达式 返回 true,那么该声明没有效果。否则将发布编译时错误,且当存在 消息时诊断消息中会包含其文本。
消息 可以省略。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| #include <type_traits> template <class T> void swap(T& a, T& b) noexcept { static_assert(std::is_copy_constructible<T>::value, "交换需要可复制"); static_assert(std::is_nothrow_copy_constructible<T>::value && std::is_nothrow_copy_assignable<T>::value, "交换需要可复制及可赋值,且无异常抛出"); auto c = b; b = a; a = c; } template <class T> struct data_structure { static_assert(std::is_default_constructible<T>::value, "数据结构要求元素可默认构造"); }; struct no_copy { no_copy ( const no_copy& ) = delete; no_copy () = default; }; struct no_default { no_default () = delete; }; int main() { int a, b; swap(a, b); no_copy nc_a, nc_b; swap(nc_a, nc_b); data_structure<int> ds_ok; data_structure<no_default> ds_error; } 可能的输出:
1:错误:静态断言失败:交换需要可复制 2:错误:静态断言失败:数据结构要求元素可默认构造
|