C++17新特性

语言特性

  1. 使用auto声明非类型模板参量

  2. 折叠表达式

    提供模板参数包的折叠

    template <typename... Args>
    bool logicalAnd(Args... args) {
    // 二元折叠
    return (true && ... && args);
    }
    bool b = false;
    bool& b2 = b;
    logicalAnd(b, b2, true); // == false template <typename... Args>
    auto sum(Args... args) {
    // 一元折叠
    return (... + args);
    }
    sum(5, 5.0, 7); // == 17
  3. 内联变量

  4. constexpr lambda

    使用constexpr完成编译时的lambda表达式

  5. 列表初始化推导新规则

    auto x = {1, 2, 3}; // deduct to std::initializer_list<int> before ,now deduct to int
  6. 嵌套命名空间

    这个特性使命名空间嵌套更加简洁:

    // before c++17
    namespace A{
    namespace B{
    namespace C{
    int i;
    }
    }
    } // c++17
    namespace A::B::C{
    int i;
    }
  7. 结构绑定

    这个特性可以用于解结构初始化,使用方式为auto [x,y,z] = expr;expr为类元组对象时,其中的元素将对应绑定到x,y,z。类元组对象包括std::pair, std::turple, std::array等。

    // first example
    using Pair = std::pair<int, int>;
    Pair init(){
    return Pair{0, 0};
    } const auto [x, y] = init();
    x; // x == 0
    y; // y == 0 // second example
    using u_map = std::unordered_map<std::string, int>;
    u_name mapping{
    {"a", 1},
    {"b", 2},
    {"c", 3}
    }; // destructure by reference
    for (const auto [key, value] : mapping){
    cout << key << ":" << value << endl;
    }
  8. 选择语句初始化器

    • if initializer

      // before c++17
      std::mutex mtx;
      {
      std::lock_guard<std::mutex> lk(mtx);
      if (v.empty()) v.push(val);
      } // c++17
      std::mutex mtx;
      {
      if (std::lock_guard<std::mutex> lk(mtx); v.empty()){
      v.push(val);
      }
      }
    • switch initializer

      // before c++17
      A apple(args);
      switch(auto s = apple.stat()){
      // body
      } // c++17
      switch(A apple(args); auto s = apple.stat()){
      // body
      }
  9. constexpr if

    用于编写依赖于编译时条件实例化的代码

  10. UTF-8 字面字符

    char c = u8'a';
  11. 枚举列表直接初始化

    枚举现在能够使用列表进行初始化

    enum byte: unsigned char{};
    byte a = {0};
    byte d = byte{256};
  12. [[nodiscard]] [[fallthrough]] [[maybe_unused]] 属性

  13. __has_include宏操作符

    这个特性可以用来检查库是否可以被引入。

    #ifdef __has_include
    #if __has_include(<iostream>) // 如果能够引入,返回true
    #include <iostream>
    #define have_iostream 1
    #else
    #define have_iostream 0
    #endif
  14. 类模板参数推导(CTAD

    这个特性,使类模板的参数也能够进行推导

    std::vector nums{1, 2, 3}; // deduct to std::vector<int>
    
    std::mutex mtx;
    auto lk = std::lock_guard{mtx}; // deduct to std::lock_guard<std::mutex> auto p = std::pair{0.2, 0.3}; // deduct to std::pair<int, int>

库特性

  1. std::variants

    相当于类型安全的union,同时只能存在一个值

    std::variant<int, int, double>  v{1.20};
    std::get<double>(v); // 1.20
    std::get<2>(v); // 1.20
  2. std::optional

    std::optional<std::string> create(bool b) {
    if (b) {
    return "cts";
    } else {
    return {};
    }
    } create(false).value_or("mx"); // == "mx"
    create(true).value(); // == "cts"
  3. std::any

    类型安全的容器,存放任意类型的单值。

    std::any x{1};
    any_cast<int>(x);
    std::any_cast<int&>(x) = 10; // x==10
    int s = any_cast<int>(x); // 这一步会将x存储的值转换为一个左值。
  4. std::string_view

    非所有权字符串引用

  5. std::invoke

    唤醒一个有参数的可调用对象

  6. std::apply

    唤醒一个有参数元组的可调用对象

  7. std::filesystem

    提供操作文件系统目录、文件和路径的标准方式。

  8. std::byte

    提供一个以字节表示数据的标准方式,与charunsigned char相比的优点是byte对象非字符类型和算术类型,只能够使用位操作。

    std::byte x {0};
    std::byte y {0xAA};
    std::byte z = x & y;
    int i = std::to_integer<int>(z); // 0
  9. mapset的分片

  10. 并行算法

    增加了find, copy, sort的并行执行操作par并行, seq顺序, par_unseq并行非顺序

    std::vector v;
    std::find(std::execution::par, v.begin(), v.end(), 2);
  11. std::sample

    sample给定学列中的若干个元素,每个元素都有一个均等的被挑选的机会。

  12. std::clamp

    clamp的作用是获取一个在由高值、低值范围限定的给定值。

  13. std::reduce

    std::accmulate类似,在<numeric>中。

  14. prefix sum algorithms

    inclusive_scanexclusive_scan

  15. GCD (great common divisor)LCM (least common multiple)

    最大公约数和最小公倍数,最小公倍数是基于最大公约数进行计算的

    const int a = 9;
    const int b = 3;
    std::gcd(a, b); // 3
    std::lcm(a, b); //
  16. std::not_fn

    返回给定函数结果的否定值

  17. 字符串转换to/from数字

    • to_chars()
    • from_chars()

C++17新特性的更多相关文章

  1. c++17 新特性

    编译环境说明:gcc 8.1 + eclipse +windows 10 eclipse cpp默认支持c++14,做c++17开发时,需要手动进行配置. 1.关键字 1)constexpr c++1 ...

  2. Java 17 新特性:switch的模式匹配(Preview)

    还记得Java 16中的instanceof增强吗? 通过下面这个例子再回忆一下: Map<String, Object> data = new HashMap<>(); da ...

  3. C++17 新特性之 std::optional(上)

    最近在学习 c++ 17 的一些新特性,为了加强记忆和理解,把这些内容作为笔记记录下来,有理解不对的地方请指正,欢迎大家留言交流. 引言 在介绍之前,我们从一个问题出发,C++ 的函数如何返回多个值? ...

  4. C++11 & C++14 & C++17新特性

    C++11:C++11包括大量的新特性:包括lambda表达式,类型推导关键字auto.decltype,和模板的大量改进. 新的关键字 auto C++11中引入auto第一种作用是为了自动类型推导 ...

  5. 从Java 9 到 Java 17 新特性梳理

    Java 9 新的创建集合的方法  // [1, 2, 3, 4]  List<Integer> integers = List.of(1, 2, 3, 4);  // {1,2,3}   ...

  6. C++17新特性optional和string_view

    1. optional的作用 类模板 std::optional 管理一个可选的容纳值,即可以存在也可以不存在的值. 一种常见的 optional 使用情况是一个可能失败的函数的返回值.与其他手段,如 ...

  7. Java9至17的新特性总结

    总览 讲讲Java 9-17 的一些语法糖和一些新发布的jeps, 重点讲讲JVM的垃圾回收器 时间线 SpringBoot 为什么选择Java17这个版本.我估计跟下面这个图有关系. Java 8 ...

  8. 你需要了解的 C++ 17 Top 19 新特性(附精彩评论)

    什么是 C++17? C++17(或 C++1z)是继 C++14 之后 C++ 编程语言 ISO/IEC 标准的下一次修订的非正式名称.C++17 现在功能已齐全,正在成为国际标准的路上.它的规范已 ...

  9. JDK 16 正式发布,一次性发布 17 个新特性…不服不行!

    上一篇:Java 15 正式发布, 14 个新特性 JDK 16 正式发布 牛逼啊,JDK 15 刚发布半年(2020/09/15),JDK 16 又如期而至(2021/03/16),老铁们,跟上. ...

  10. 11g新特性-使用DNFS

    NFS相信应该都很熟悉了,但是我们对它的性能一直有所诟病.Oracle在10g版本通过允许对数据库文件直接IO引入ASM.在11g版本中,Oracle对NFS提供了类似的增强,为了改进NFS的性能,开 ...

随机推荐

  1. 高通驱动树中的GPIO详解

    高通驱动树中的GPIO详解 reference:https://blog.csdn.net/baidu_37503452/article/details/80257441 Drive Strength ...

  2. DVT:华为提出动态级联Vision Transformer,性能杠杠的 | NeurIPS 2021

    论文主要处理Vision Transformer中的性能问题,采用推理速度不同的级联模型进行速度优化,搭配层级间的特征复用和自注意力关系复用来提升准确率.从实验结果来看,性能提升不错 来源:晓飞的算法 ...

  3. Oracle 字符串分割,并将内码转中文(简单实现),项目实战

    导读 实际项目开发过程中,可能会遇到这种情况,A表中A1字段存储B表中的内码如(1,2,3),此时需要将A表中的A1字段转中文,为了方便理解,我们这里创建学生表和老师表,一个学生对应N个老师. 创建表 ...

  4. Go微服务开发指南

    在这篇深入探讨Go语言在微服务架构中的应用的文章中,我们介绍了选择Go构建微服务的优势.详细分析了主要的Go微服务框架,并探讨了服务发现与注册和API网关的实现及应用. 关注TechLead,复旦博士 ...

  5. [oeasy]python0069_帮助手册_pydoc_manual_document

    帮助手册 回忆上次内容   上次了解了注释 注释是为了让程序更可读 注释不会影响程序运行速度   注释分为两种 单行的 以#开头 不能是字符串当中的#   多行的 三个" 三个'     多 ...

  6. oeasy教您玩转vim - 11 - # 向前向后

    向前向后 回忆上节课内容 我们上次强化了起手势 回忆了基本的移动方式 hjkl 除 hjkl 外,据说还有更厉害的移动方式 是什么呢? 下素材 #这个素材,我们下载过,重温一下 wget github ...

  7. Arch Linux install i3-wm

    Arch Linux install i3-wm 简介 i3-wm 是一种动态的平铺式窗口管理器,它的设计目标是提供一个快速.简洁.可定制的桌面环境,适合开发者和高级用户使用.它有以下几个特点: 它使 ...

  8. Jenkins 配合Pipeline使用Docker

    配合Pipeline使用Docker 许多组织使用Docker跨机器统一构建和测试环境,并为部署应用程序提供高效机制.从Pipeline 2.5及更高版本开始,Pipeline内置了从Jenkinsf ...

  9. redis如何实现主从同步

    redis实现主从同步分为两种:全量同步和增量同步:第一次连入集群的slave需要进行全量同步,那些断开后重连的slave需要进行增量同步 每个redis都有自己的replid,他们是master的标 ...

  10. 关于android的图像视图的基本了解

    最好直接复制进去而不是拖进去 图片直接导入最好用小写字母命名,数字与字母之间要用_,而且数字好像不可以连用 centerInside,fitCenter,center的区别: centerInside ...