C++17新特性学习笔记

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408209.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

教你如何写框架------用中文构建脚本

框架下载地址&#xff1a; http://files.cnblogs.com/zhangfei/Automation.rar 在看此篇博文前请先理清如下两下博文, 该博文是建立在如下两篇文章的基础上的&#xff1a; http://www.cnblogs.com/zhangfei/p/3456159.htmlhttp://www.cnblogs.com/zhangfei/archive/2012/10/10/…

配置MIME一览

用JSP写WML&#xff1a;Code:<% page contentType"text/vnd.wap.wml; charsetGBK" %> <?xml version"1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.WAPforum.org/DTD/wml_1.1.xml"> …

滚动条添加事件

1、 <script type"text/javascript"> $(document).ready(function (){ var nScrollHight 0; //滚动距离总长,即750px var nScrollTop 0; //滚动到的当前位置 var nDivHight $("#div1").height(); //即500px …

C++三路比较运算符

左操作数 <> 右操作数 表达式返回一个对象&#xff08;其实是这个std::strong_ordering&#xff09;&#xff0c;使得 若 左操作数 < 右操作数 则 (a <> b) < 0 若 左操作数 > 右操作数 则 (a <> b) > 0 而若 左操作数 和 右操作数 相等/等价…

使用WSE实现Web Service安全

WSE(Web Services Enhancements)是微软为了使开发者通过.NET创建出更强大&#xff0c;更好用的Web Services而推出功能增强插件。现在最新的版本是WSE2.0(SP2).本文描述了如何使用WSE2.0中的安全功能增强部分来实现安全的Web Services。WSE的安全功能增强实现的是WS-Security标…

spring之:XmlWebApplicationContext作为Spring Web应用的IoC容器,实例化和加载Bean的过程...

它既是 DispatcherServlet 的 (WebApplicationContext)默认策略&#xff0c;又是 ContextLoaderListener 创建 root WebApplicationContext(根容器&#xff0c;同时也是 DispatcherServlet 的 WebApplicationContext 的父容器)的默认策略。 继承体系 一、XmlWebApplicationCont…

C++17代码整洁之道

C17代码整洁之道 C代码整洁的基本规范 良好的命名 名称应该自解释使用域中的名称避免使用匈牙利命名法(即名称前加类型)不要通过注释禁用代码 函数 只做一件事情 函数体量要小 当你为函数找到一个富有表现力的名称时,名称中没有连词 圈复杂度低 函数的参数要少 函数尽…

使用.NET Remoting开发分布式应用——基于租约的生存期(转载)

使用.NET Remoting开发分布式应用——基于租约的生存期一&#xff0e;概述知名类型的SingleCall对象可以在客户程序的方法调用之后被垃圾收集器清理掉&#xff0c;因为它没有保持状态&#xff0c;属于无状态的。而客户激活的类型的对象和知名类型的SingleTon对象都属于生存期长…

std::function和std::bind

std::function和std::bind std::function 可调用对象 是一个函数指针是一个具有operator()成员函数的类和对象可被转换成函数指针的类对象&#xff1b;一个类成员函数指针&#xff1b; C中可调用对象的虽然都有一个比较统一的操作形式&#xff0c;但是定义方法五花八门&…

如何理解Bounce Rate和Exit Rate

先说说两者的定义&#xff1a; 1&#xff09;Bounce Rate&#xff1a;从某个特定的页面进入网站的Visit中&#xff0c;有多少百分比什么都没有做&#xff08;没有点击任何链接&#xff09;&#xff0c;然后就离开了网站&#xff08;即关闭了这个特定的页面&#xff09;。例如&a…

我的blog开张了,希望大家能多多赏光啊

今天&#xff0c;风很大&#xff0c;前两天刚刚有点春天的感觉&#xff0c;今天全被风刮没了。上网碰到以前很好的同事&#xff0c;谈到如果他也成家了&#xff0c;我们还会不会这样肆无忌惮的说着心事&#xff1f;他说不会的&#xff0c;但是我觉得那是他还没有结婚&#xff0…

配置 Sybase数据源

1.Start-- > All Programs -- > Sybase - -> Connectivity --> click ‘Open Client Directory Service Editor’ 2.在Server窗口右击鼠标 Right Click -- > select ‘Add’ item 3 弹出’Input Server Name’窗口,输入Server name(服务器名称) ServerName: DM…

C++虚函数表

虚函数 对C 了解的人都应该知道虚函数&#xff08;Virtual Function&#xff09;是通过一张虚函数表&#xff08;Virtual Table&#xff09;来实现的。简称为V-Table。在这个表中&#xff0c;主是要一个类的虚函数的地址表&#xff0c;这张表解决了继承、覆盖的问题&#xff0…

Proxy Pattern using C# (转载)

Proxy Pattern&#xff08;代理模式&#xff09;属于Structural Pattern&#xff08;结构型模式&#xff09;&#xff0c;Proxy Pattern-为Client真正要调用的对象提供一个代理&#xff08;Surrogate or placeholder&#xff09;&#xff0c;来控制Client对该对象的访问。 1. U…

【设计模式】五、单例模式(独一无二的对象)

一、概述&#xff1a; 有一些对象我们只需要一个&#xff0c;比方说&#xff1a;线程池&#xff08;threadpool&#xff09;、缓存&#xff08;cache&#xff09;、对话框、处理偏好设置和注册表对象、日志对象、充当打印机、显卡等设备的驱动程序的对象。事实上这些对象只需要…