c++ static_assert关键字
前言static_assert在c++0x中加入该关键字,用来做编译期间的断言,也叫静态断言。该关键字是从c语言的assert中继承过来的,但是assert是在运行期间的断言。static_assert语法static_assert的语法有两种:static_assert ( 布尔常量表达式 , 消息 )(C++11 起)static_assert ( 布尔常量表达式 )(C++...
前言
static_assert在c++0x中加入该关键字,用来做编译期间的断言,也叫静态断言。该关键字是从c语言的assert中继承过来的,但是assert是在运行期间的断言。
static_assert语法
static_assert的语法有两种:
static_assert ( 布尔常量表达式 , 消息 ) (C++11 起)
static_assert ( 布尔常量表达式 ) (C++17 起)
如果布尔常量表达式为真,则static_assert无作用;如果布尔常量表达式为假,则它就会发布一个编译时的错误,错误的提示就是第二个参数,在c++17中可以省略该消息。事实上增加消息变量能够更加让程序员知道编译出错的位置。在c语言的assert关键字中,如果检验多个条件时,在发生断言时,程序员就无法直观的知道到底哪一个断言触发了,static_assert中接收了消息变量就比较好区分了。
说明
1.由于static_assert是编译期间断言的,所以第一个参数必须是常量,语法中也有说明,而不能是变量。
2.c语言中assert是运行期间断言的,所以在运行过程中反复调用会极大的影响程序的性能,增加额外开销,但是static_assert是编译期间断言的,所以不会生成目标代码,不会对最终程序的运行造成任何的性能影响.
3.如果该常量表达式依赖于某些模板参数,则延迟到模板实例化时再进行演算。
范例
static_assert断言很多时候都用在对参数判断的场景,从一些官方源码中可以看到很多静态断言,以下是从unique_ptr源码中摘抄的一部分:
explicit unique_ptr(pointer __p) noexcept : _M_t(__p, deleter_type())
{ static_assert(!is_pointer<deleter_type>::value,
"constructed with null function pointer deleter"); }
unique_ptr(pointer __p,
typename remove_reference<deleter_type>::type&& __d) noexcept
: _M_t(std::move(__p), std::move(__d))
{ static_assert(!std::is_reference<deleter_type>::value,
"rvalue deleter bound to reference"); }
constexpr unique_ptr() noexcept
: _M_t()
{ static_assert(!std::is_pointer<deleter_type>::value,
"constructed with null function pointer deleter"); }
更多推荐
所有评论(0)