c++ static_assert关键字

前言

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值