1. [[fallthrough]]
表示有意从case语句直落(没有break/return),例子
switch (c)
{
case 2:
xxxxxxx;
[[fallthrough]]; // 去掉会报错
case 3:
xxxxxxx;
break;
}
2. [[nodiscard]]
标记返回值不应被丢弃
[[nodiscard]] bool test()
{
........;
return true;
}
bool f = test(); // 正确
test(); // 错误
3. [[maybe_unused]]
标记参数或亦是可能不被使用
void test([[maybe_unused]] int a)
{
[[maybe_unused]] int b = 0;
}
4. using
语法:
using 别名 = 类型;
类型可以是饮食&
、const
、typename <T>
、[]
的类型
5. lambda表达式
- 不般不用说明返回值,也可以用
->
指定返回类型 - 用auto接收lambda表达式
[]
放置需要捕获的本地变量- lambda可以直接访问全局变量,不需要捕获
5.1. 利用lambad表达式消除多重初始化路径
例子1:
Obj obj; // 1
switch(int_mode)
{
case mode1:
obj = Obj(...); // 2
break;
case mode2:
obj = Obj(...); // 2
break;
}
这段代码存在这样一些问题:
- 未初始化,存在安全隐患
- 存在copy或move,性能不友好
例子2:
auto obj = [&] // 1
{
switch (init_mode)
{
case mode1:
return Obj(...); // 2
break;
case mode2:
return Obj(...); // 2
break;
}
}(); // 3
说明:
[&]
表明按引用捕获所有本地变量- 利用了返回值优化,性能和安全都更好
- 后面跟一个()表示声明一个lambda表达式后立即执行
5.2. 变量捕获
符号 | 按值/引用捕获 | 捕获范围 |
---|---|---|
= | 值 | 所有本地变量 |
& | 引用 | 所有本地变量 |
本地变量名 | 值 | 这个变量 |
&本地变量名 | 引用 | 这个变量 |
this | 引用 | 外围对象 |
*this | 值 | 外围对象 |
变量名=表达式 | 值 | 表达式结果 |
&变量名=表达式 | 引用 | 表达式结果的引用 |
5.3. 泛型lambda表达式
6. std::function
有点像函数版的any
例子:
static map<string, function<int(int, int)>> op_dict
{
{“+”, [](int x, int y){return x+y;}},
{“-”, [](int x, int y){return x-y;}},
{“*”, [](int x, int y){return x*y;}},
{“/”, [](int x, int y){return x/y;}},
};
// 使用
op_dict["+"](x, y);