Skip to content

Commit cef6f2f

Browse files
committed
add note of chapter 19
1 parent 439c79c commit cef6f2f

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

_posts/2024-10-01-现代C++语言核心特性解析.md

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

195196
c++17添加constexpr关键字,以及捕获this指针,在捕获列表中直接使用this纸箱对象的成员。
196197

197-
c++20加入[=, this],以区分[=, *this]
198+
c++20加入`[=, this]`,以区分`[=, *this]`
198199

199200
c++20中添加模板对lambda的支持`[]<typename T>(T t) {}`
200201

@@ -353,3 +354,15 @@ C++20标准增加了对初始化语句的支持。`for (T thing = foo(); auto &
353354
## 支持初始化语句的if和switch(C++17)
354355

355356
C++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

Comments
 (0)