@@ -33,6 +33,7 @@ date: 2024-10-01
3333- [ override和final说明符(C++11)] ( #override和final说明符c11 )
3434- [ 基于范围的for循环(C++11 C++17 C++20)] ( #基于范围的for循环c11-c17-c20 )
3535- [ 支持初始化语句的if和switch(C++17)] ( #支持初始化语句的if和switchc17 )
36+ - [ static\_ assert声明] ( #static_assert声明 )
3637
3738## 新基础类型(C++11~C++20)
3839
@@ -165,7 +166,7 @@ c++针对局部变量和右值引用的隐式移动操作进行了优化。
165166
166167语法定义:` [ captures ] ( params ) specifiers exception -> ret { body } `
167168
168- - [ captures ] —— 捕获列表,它可以捕获当前函数作用域的零个或多个变量,变量之间用逗号分隔。
169+ - ` [ captures ] ` —— 捕获列表,它可以捕获当前函数作用域的零个或多个变量,变量之间用逗号分隔。
169170- ( params ) —— 可选参数列表.
170171- specifiers —— 可选限定符,C++11中可以用mutable,它允许我们在lambda表达式函数体内改变按值捕获的变量,或者调用非const的成员函数。
171172- exception —— 可选异常说明符,我们可以使用noexcept来指明lambda是否会抛出异常。
@@ -186,15 +187,15 @@ lambda表达式类似函数对象。在编译器由编译器自动生成一个
186187
187188简单捕获:
188189
189- - [ this] —— 捕获this指针,捕获this指针可以让我们使用this类型的成员变量和函数。
190- - [ =] —— 捕获lambda表达式定义作用域的全部变量的值,包括this。
191- - [ &] —— 捕获lambda表达式定义作用域的全部变量的引用,包括this。
190+ - ` [this] ` —— 捕获this指针,捕获this指针可以让我们使用this类型的成员变量和函数。
191+ - ` [=] ` —— 捕获lambda表达式定义作用域的全部变量的值,包括this。
192+ - ` [&] ` —— 捕获lambda表达式定义作用域的全部变量的引用,包括this。
192193
193194初始化捕获支持捕获表达式结果以及自定义捕获变量名。
194195
195196c++17添加constexpr关键字,以及捕获this指针,在捕获列表中直接使用this纸箱对象的成员。
196197
197- c++20加入[ =, this] ,以区分[ =, * this]
198+ c++20加入` [=, this] ` ,以区分` [=, *this] `
198199
199200c++20中添加模板对lambda的支持` []<typename T>(T t) {} ` 。
200201
@@ -353,3 +354,15 @@ C++20标准增加了对初始化语句的支持。`for (T thing = foo(); auto &
353354## 支持初始化语句的if和switch(C++17)
354355
355356C++17 允许在执行调节语句之前先执行一个初始化语句:` if (init; condition) {} ` ,变量拥有和整个if结构一样长的生命周期。else if 之中也支持初始化语句。可以利用这种方式对整个if结构加锁。switch也支持初始化语句。
357+
358+ ## static_assert声明
359+
360+ 断言不能代替程序中的错误检查,它只应该出现在需要表达式返回true的位置,相反,如果表达式中涉及外部输入,则不应该依赖断言,例如客户输入、服务端返回等。
361+
362+ 需要静态断言在编译阶段对模板实参进行约束。
363+
364+ C++11标准规定,使用static_assert需要传入两个实参:常量表达式和诊断消息字符串。
365+
366+ C++17标准中运行单参数的static_assert。
367+
368+ 当断言表达式时常量表达式时,应该优先使用static_assert静态断言。
0 commit comments