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 别名 = 类型;

类型可以是饮食&consttypename <T>[]的类型

5. lambda表达式

  1. 不般不用说明返回值,也可以用->指定返回类型
  2. 用auto接收lambda表达式
  3. []放置需要捕获的本地变量
  4. lambda可以直接访问全局变量,不需要捕获

5.1. 利用lambad表达式消除多重初始化路径

例子1:

Obj obj; // 1
switch(int_mode)
{
    case mode1:
        obj = Obj(...);  // 2
        break;
    case mode2:
        obj = Obj(...);  // 2
        break;
}

这段代码存在这样一些问题:

  1. 未初始化,存在安全隐患
  2. 存在copy或move,性能不友好

例子2:

auto obj = [&]  // 1
{
    switch (init_mode)
    {
        case mode1:
            return Obj(...);  // 2
            break;
        case mode2:
            return Obj(...);  // 2
            break;
    }
}(); // 3

说明:

  1. [&]表明按引用捕获所有本地变量
  2. 利用了返回值优化,性能和安全都更好
  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);

results matching ""

    No results matching ""