| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> c++ 17 新特性理解 -> 正文阅读 |
|
[C++知识库]c++ 17 新特性理解 |
1构造函数模板推导 在C++17前构造一个模板类对象需要指明类型:
std::tuple<int, double, std::string> tq(64, 128.0, "Caroline");? C++17就不需要特殊指定,直接可以推导出类型,代码如下:std::tuple eee(64, 128.0, "Caroline");
如果是tuple, 则是? std::tuple eee(64, 128.0, "Caroline");? 2.结构化绑定(Structured bindings) 结构化绑定提供了类似其他语言中提供的多返回值的功能。到目前为止,我们可以通过 std::tuple 来构造一个元组,囊括多个返回值。但缺陷是显而易见的,我们没有一种简单的方法直接从元组中拿到并定义元组中的元素,尽管我们可以使用 std::tie 对元组进行拆包,但我们依然必须非常清楚这个元组包含多少个对象,各个对象是什么类型。 std::tuple<int,double,std::string> f() { 结构化绑定还可以改变对象的值,使用引用即可:
注意结构化绑定不能应用于constexpr
?结构化绑定不止可以绑定pair和tuple,还可以绑定数组和结构体等
3.if-switch语句初始化? C++17前if语句需要这样写代码:
?4.内联变量 C++17前只有内联函数,现在有了内联变量,我们印象中C++类的静态成员变量在头文件中是不能初始化的,但是有了内联变量,就可以达到此目的:
5.折叠表达式C++17引入了折叠表达式使可变参数模板编程更方便:
?6.constexpr lambda表达式 C++17前lambda表达式只能在运行时使用,C++17引入了constexpr lambda表达式,可以用于在编译期进行计算。
注意:constexpr函数有如下限制: 函数体不能包含汇编语句、goto语句、label、try块、静态变量、线程局部存储、没有初始化的普通变量,不能动态分配内存,不能有new delete等,不能虚函数。 7.namespace嵌套
8.__has_include预处理表达式 可以判断是否有某个头文件,代码可能会在不同编译器下工作,不同编译器的可用头文件有可能不同,所以可以使用此来判断。 int main() 9.在lambda表达式用*this捕获对象副本 正常情况下,lambda表达式中访问类的对象成员变量需要捕获this,但是这里捕获的是this指针,指向的是对象的引用,正常情况下可能没问题,但是如果多线程情况下,函数的作用域超过了对象的作用域,对象已经被析构了,还访问了成员变量,就会有问题。
所以C++17增加了新特性,捕获*this,不持有this指针,而是持有对象的拷贝,这样生命周期就与对象的生命周期不相关啦。
10.新增Attribute 我们可能平时在项目中见过declspec, __attribute?, #pragma指示符,使用它们来给编译器提供一些额外的信息,来产生一些优化或特定的代码,也可以给其它开发者一些提示信息。 例如:
?[[fallthrough]],用在switch中提示可以直接落下去,不需要break,让编译期忽略警告 [[nodiscard]] :表示修饰的内容不能被忽略,可用于修饰函数,标明返回值一定要被处理 [[maybe_unused]] :提示编译器修饰的内容可能暂时没有使用,避免产生警告 11.字符串转换 新增from_chars函数和to_chars函数 ?? ?const std::string str{ "123456098" }; ? ?则 :value = 1234; ? ? ? ? ? ?res.ptr= 56098; 12.std::variant 具体见:CSDNhttps://mp.csdn.net/mp_blog/creation/editor/120419967 C++17增加std::variant实现类似union的功能,但却比union更高级,举个例子union里面不能有string这种类型,但std::variant却可以,还可以支持更多复杂类型,如map等。 注意,不允许使用空变量、具有引用成员的变量、具有c样式数组成员的变量和具有不完整类型(如void)的变量。没有空的状态:这意味着对于每个构建的对象,必须至少调用一个构造函数。默认构造函数初始化第一个类型(通过第一个类型的默认构造函数): 1.默认情况下,变量的默认构造函数调用第一个备选项的默认构造函数: 2.成员函数index()可用于查明当前设置了哪个选项(第一个选项的索引为0)。 3.访问值的通常方法是调用get<>()获取对应的选项值。可以传递它的索引或者类型 #include <variant> var = "world"; std::cout << s << std::endl;? ?//world var = 3; std::cout << i?<< std::endl;? ?//3 如果没有为第一个类型定义默认构造函数,则调用该变量的默认构造函数会在编译时错误: 不过辅助类型std::monostate提供了处理这种情况的能力,还提供了模拟空状态的能力。 std::monostate std::variant<std::monostate, NoDefConstr> v2; // OK 4.赋值和emplace()操作对应于初始化: std::variant<int, int, std::string> var; // sets first int to 0, index()==0 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/29 4:29:11- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |