c++17最新特性笔记

1.基本语言特性

​ 这一部分介绍了 C++17中新的核心语言特性,但不包括那些专为泛型编程(即 template)设计的特性。

结构化绑定

结构化绑定允许你用一个对象的元素或对象初始化多个实例(第一眼感觉Python解包很像)

这有一个结构体

struct MyStruct
{int i = 0;std::string s;
};
MyStruct ms;

可以通过如下声明把该结构体的两个成员绑定到新的变量名

auto [u, v] = ms;
auto [u1, v1] {ms};
auto [u2, v2] (ms);

结构化绑定对于返回结构体或者数组的函数非常有用

MyStruct returnStruct()
{return MyStruct{ 42,"Tom" };
}

我们可以把结构体中的成员变量分别赋值给两个新的局部变量

auto [id, name] = returnStruct();

还可以再进行操作

if (id>16){/*...*/}

结构化绑定还能大幅提高代码的可读性

例如:

不使用结构化绑定,对std::map的遍历需要这么写

for (auto& elem : m1){cout << elem.first << elem.second;}

下面是使用结构化绑定:

for (const auto& [key,value] : m1){cout << key << value << endl;}

增加了代码的可读性(真的越来越现代了cpp)

1.1.1细说结构化绑定

绑定到一个匿名实体

auto [u, v] = ms;

这段代码实际上是做了如下操作:

auto e = ms;
... u = e.i;
... v = e.s;

这就意味这u,v是结构体内成员变量的拷贝(拷贝对象e的生命周期和结构化绑定一样长)

e 的生命周期和结构化绑定的生命周期相同,当结构化绑定离开作用域时 e 也会被自动销毁。另外,除非使用了引用,否则修改结构化绑定的变量并不会影响被绑定的变量:

MyStruct ms{42, "hello"};
auto [u, v] = ms;
ms.i = 77;

使用修饰符

我们可以在结构化绑定中使用修饰符,例如 const 和引用,这些修饰符会作用在匿名实体 e 上。通常情况

下,作用在匿名实体上和作用在结构化绑定的变量上的效果是一样的,但有些时候又是不同的(见下文)。

例如,我们可以把声明一个结构化绑定声明为 const 引用:

const auto& [u, v] = ms; // 引 用, 因 此u/v指 向ms.i/ms.s

这里,匿名实体被声明为 const引用,而u 和 v 分别是这个引用的成员 i 和s 的别名。因此,对ms 的成员的修

改会影响到 u 和 v 的值:

ms.i = 77; // 影 响u的 值std::cout << u; // 打 印 出77

如果声明为非 const引用,你甚至可以修改对象的成员:

MyStruct ms{42, "hello"};auto& [u, v] = ms; // 被 初 始 化 的 实 体 是ms的 引 用ms.i = 77; // 影 响 到u的 值std::cout << u; // 打 印 出77u = 99; // 修 改 了ms.istd::cout << ms.i; // 打 印 出99

如果一个结构化绑定是引用类型,而且是对一个临时对象的引用,那么和往常一样,临时对象的生命周期会被

延长到结构化绑定的生命周期:

MyStruct getStruct();...const auto& [a, b] = getStruct();std::cout << "a: " << a << '\n'; // OK

修饰符并不是作用在结构化绑定引入的变量名上

修饰符会作用在新的匿名实体上(即上文中的e)而不会是u,v

const auto&[u,v] = ms;

uv都不是引用,只有匿名实体e是引用。u 和 v 分别是 ms 对应的成员的类型,只不过变成了const 的。根据我们的推导,decltype(u)const intdecltype(v)const std::string

结构体绑定适用的场景

原则上讲,结构化绑定适用于所有只有 public 数据成员的结构体、C风格数组和类似元组 (tuple-­like)的对象:

• 对于所有非静态数据成员都是 public 的结构体和类,你可以把每一个成员绑定到一个新的变量名上。

• 对于原生数组,你可以把数组的每一个元素都绑定到新的变量名上。

• 对于任何类型,你可以使用 tuple­like API 来绑定新的名称,无论这套 API 是如何定义“元素”的。对于一个类型 type这套 API 需要如下的组件:

  • std::tuple_size<type>::value 要返回元素的数量。

  • std::tuple_element<idx, type>::type 要返回第 idx 个元素的类型。

  • 一个全局或成员函数 get<idx>() 要返回第 idx 个元素的值。

注意要使用结构化绑定需要继承时遵循一定的规则。所有的非静态数据成员必须在同一个类中定义(也就是说,这些成员要么是全部直接来自于最终的类,要么是全部来自同一个父类):

struct B
{int a = 0;int b = 3;
};struct B1 :B
{int c = 4;
};
auto [x, y] = B{};//OK
auto [x1, y1, z1] = B1{};//ERROR

原生数组

int arr[] = { 1,2 };
auto [a1, b1] = arr; //按值拷贝

std::pair, std::tuple std::array

C++17新特性学习笔记相关推荐

  1. jdk7新特性学习笔记

    jdk7新特性学习笔记 从网络down了视频看,记录下学过的东西. 1.二进制字面量 JDK7开始,可以用二进制来表示整数(byte,short,int和long),语法:在二进制数值前面加 0b或者 ...

  2. Java8新特性学习笔记

    Java8新特性学习笔记 文章目录 Java8新特性学习笔记 一.接口和日期处理 1.接口增强 1.1.JDK8以前 VS JDK8 1)接口定义: 1.2.默认方法(default) 1)默认方法格 ...

  3. JDK8新特性-学习笔记

    雀语笔记连接: https://www.yuque.com/g/u22538081/ghlpft/zcbyis/collaborator/join?token=pofOuJabmo9rgKvS# 邀请 ...

  4. java8新特性学习笔记(Lambda,stream(),filter(),collect(),map())

    文章目录 1.lambda表达式(重点) 1.需求分析 2.Lambda表达式初体验 3.Lambda的语法规则 3.1 Lambda练习1 3.1 Lambda练习2 4.Lambda表达式的原理 ...

  5. java8新特性学习笔记之唠唠“匿名内部类与lambda”

    负一.知道啥是匿名内部类不? 要使用lambda,我觉得你至少得明白匿名内部类是个啥."o -> o.getName"是lambda表达式,"Book::getNa ...

  6. 阿瑶的ES6新特性学习笔记

    导语: 什么是 ECMA? ECMA(European Computer Manufacturers Association)中文名称为欧洲计算机制造商协会,这个 组织的目标是评估.开发和认可电信和计 ...

  7. C++11新特性学习笔记

    (注:此笔记参照C++ Primer Plus 6) 1.数组初始化 1.)初始化数组时,可以省略等号 //int array[3] = {0, 1, 2}; int array [3] {0, 1, ...

  8. java8新特性学习笔记链接

    https://blog.csdn.net/yitian_66/article/details/81010434 转载于:https://www.cnblogs.com/wangxuekui/p/10 ...

  9. java 张龙_张龙 JAVA5新特性学习笔记

    1.增强的for循环,这点比较简单,就不举例了,但要注意: 增强的for循环与传统的for循环相比写起来更简洁,更容易理解,但是他也有一个缺点:他失去了数组或者集合的索引信  息,如果要对数组或集合里 ...

最新文章

  1. attr,abbr,addr三个常见的单词意思
  2. MySQL 使用SELECT ... FOR UPDATE 做事务写入前的确认(转)
  3. apache phoenix 安装试用
  4. table每行自动触发ajax,table.ajax.reload()成功后未触发:function()
  5. 论文浅尝 - AAAI2021 | 基于对比学习的三元组生成式抽取方法
  6. ajax同步和异步提交的区别
  7. linux中paste的用法,在Linux中使用Paste命令来合并行,包括使用Paste命令技巧及注意事项...
  8. SAP License:供应链管理和ERP的关系?
  9. EasyUI权限(二星权限)
  10. 操作系统——进程间通信
  11. 如何克隆LINUX硬盘:4种方法
  12. 蓝湖访问显示“加载遇到问题”
  13. 圆角半角数据库_数据库使用技巧——SQL 全角与半角切换
  14. C# 怎么把集合转换成数据库添加语句,把类转换成sql语句
  15. 将Windows驱动程序从一台计算机复制到另一台计算机
  16. 英文卡通字体_40种独特的卡通和漫画字体
  17. 基于微信小程序云开发实现的婚礼邀请函模板,可以自行定制开发
  18. 致远a8-v5-6.0协同管理软件_高危漏洞利用预警:近期利用“致远OA任意文件写入漏洞”的攻击较多...
  19. 2018年单招考试计算机试题答案,2018年单招语文模拟试题及答案.doc
  20. 【阿里云高校计划】导论-视觉AI技术应用探索 day1 【一见钟情】

热门文章

  1. python excelwriter保存路径_Python和Excel 终于可以互通了!!
  2. c语言枚举代替双switch,C语言 使用数组代替switch分支语句降低圈复杂度
  3. 王道操作系统考研笔记——2.3.4 信号量机制
  4. 第14章:傅里叶变换
  5. gcc -E 产生预编译后的文件
  6. JAVA进阶day04多态(向上转化,向下转化)
  7. [react] 为什么说React中的props是只读的?
  8. Taro+react开发(67):数组中push返回的是长度
  9. javascript学习系列(23):数组中的解构方法
  10. 前端学习(2975):路由传参的两种方式