静态断言
相关介绍:
-
预处理宏
assert()
在标准库头文件cassert
中定义。- 它可以在程序中测试逻辑表达式。
-
只要条件(表达式)是
false
,assert()
宏就会调用std::abort()
,终止程序。 -
另外
assert()
会在标准错误流cerr
中显示结果。静态断言
-
静态断言是
C++
语言的一部分,与assert
宏是不一样的。- 换句话就是静态断言是
C++
语言的内置部分,而不是标准库增加的功能。
- 换句话就是静态断言是
-
assert
宏用于在运行时动态检查条件,而静态断言则是在编译时静态检查条件的。 -
静态断言是一个关键字,而条件表达式必须在编译期间生成一个可转换为
boo
类型的结果。 -
上面第二个语法,
constant_expression
为false
时,编译失败,编译器将终止编译,并且输出一条包括了error_message
的诊断消息。C++17
新增的特性,就是在静态断言中省略error_message
字符串字面量。- 对于这一点,没有指定
error_message
的情况,编译器将会生成一个error_message
,这个生成的error_message
,通常都是基于constant_expression
生成的。 - 当然,当
constant_expression
为true
时,静态断言什么也不做。(为false
时,才需要用到error_message
,才会生成)
静态断言的另一个功能
-
在模板定义中验证模板参数的特征。
-
代码解析:
is_arithmetic<T>
是一种所谓的类型特征。该类型特征有一个value
成员,可以通过is_arithmetic<T>::value
进行访问,如果T
是算术类型(任意浮点或整数类型)其值为true
,否则为false
。- 从
C++17
开始,is_arithmetic<T>::value
,还可以写为is_arithmetic_v<T>::value
。
静态成员变量
- 把类的成员变量申明为
static
时,静态成员变量就只定义一次。- 而且,即使没有为类创建对象实例,静态成员变量也依然存在。
-
从
C++17
开始,支持内联静态成员变量。
静态常量
- 在
C++17
之前,决定什么时候能够或者不能够在类定义中直接初始化静态常量成员的规则是比较复杂的。(比如一些静态常量可以在类中定义,而其他静态常量却需要在对应的源文件中定义。) -
在
C++17
中,新引入的内联变量让初始化静态常量的工作变简单了
关于运算符的相关限制
- 虽然运算符重载很灵活、很强大,但是也存在一些限制。运算符重载,只能重载现有的运算符。 那么,这一点也就意味着:
- 不能发明新的运算符
- 不能修改现有运算符的操作数个数、相关性和优先级,同时,也不能修改运算符的操作数的计算顺序。
- 一般来说,不能重写内置的运算符,并且重载运算符的签名必须涉及至少一种类类型。
- 上述关于运算符的限制描述中,标蓝字的部分是
C++17
对运算符重载的新加限制- 在
C++17
之前,编译器可自由选择按照什么顺序来计算重载运算符的操作数 - 但是
C++17
中,重载运算符操作数与对应的内置运算符的操作数必须遵守同样的规则
- 在
noexcept
限定符相关
- 在
C++17
标准之前,通过在函数头中追加throw(type1,...,typeN)
,可指定该函数能够抛出的异常类型列表。因为这种指定方法没有效果,所以现在不再支持了。同时,C++17
标准只保留了空列表的throw()
,作为noexcept
已被弃用的同义词。
嵌套命名空间
- 简化嵌套命名空间的声明
并行计算
- 支持并行执行的
STL
算法
映射
-
映射或关联数组容器最容易被想象为字典或电话本的一般化。
- 映射中的键必须唯一,但是值不一定唯一。
-
标准库提供了两种不同的映射容器
map<Key,Value>
和unordered_map<Key,Value>
- 映射容器至少需要两个模板类型实参,一个用于决定键的类型,一个用于决定值得类型。
-
上面这个遍历映射的语法,是
C++17
新引入的。
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ C++标准库_chrono03/28
- ♥ 预处理指令记录:一07/09
- ♥ C++程序高级调试与优化_第一篇07/20
- ♥ C++_多线程相关03/12
- ♥ STL_heap06/15
- ♥ 51CTO:Linux C++网络编程四08/19