C++14部分新特性

news2025/1/16 0:52:31

文章目录

  • 1、lambda表达式
  • 2、constexpr关键字
  • 3、函数返回类型推导
  • 4、变量模版
  • 5、二进制字面值
  • 6、数字分位符
  • 7、通过类型寻址多元组
  • 8、make_unique

1、lambda表达式

C++14提供了在lambda式的形参声明中使用auto的能力
泛型 lambda:C++14 中的 lambda 表达式可以使用模板参数,使其成为一个泛型函数对象。这样可以实现更加通用的操作。例如:

auto print = [](auto value) {
    std::cout << value << std::endl;
};

print(10);       // 输出:10
print("Hello");  // 输出:Hello

泛型 lambda 函数遵循模板参数推导的规则。以上代码的作用与下面的代码相同:

struct unnamed_lambda
{
template<typename T, typename U>
auto operator()(T x, U y) const {return x + y;}
};
 
auto lambda = unnamed_lambda();

lambda 捕获表达式(在lambda初始列表中使用表达式)
C++11 的 lambda 函数通过值拷贝或引用捕获已在外层作用域声明的变量。这意味着 lambda 的值成员是不可以move的。C++14允许被捕获的成员用任意的表达式初始化。这既允许了move,也允许了任意声明 lambda 的成员,而不需要外层作用域有一个具有相应名字的变量。

这是通过使用一个初始化表达式完成的:

auto lambda = [value = 1] {return value;};

lambda 函数 lambda 的返回值是 1,说明 value 被初始化为 1。被声明的捕获变量的类型会根据初始化表达式推断,推断方式与用 auto 声明变量相同。

初始化列表可以使用move来移动外部变量

auto ptr = std::make_unique<int>(10);
auto lambda = [ptr = std::move(ptr)]{ return *ptr; };

在这里插入图片描述

constexpr lambda:C++14 中的 lambda 表达式可以被声明为 constexpr,表示它是一个编译时常量表达式。这样可以在编译时进行求值,并用于需要常量表达式的场景。例如:

constexpr auto square = [](int x) constexpr {
    return x * x;
};

constexpr int result = square(5); // 在编译时计算出结果 25

2、constexpr关键字

C++14 对 constexpr 关键字进行了一些扩展,使其能够应用于更多的情况。

放宽了对函数的限制:在 C++11 中,constexpr 函数的函数体只能有using 指令、typedef 语句、static_assert 断言、空语句,只能有一条return 语句,并且该语句必须是常量表达式。而在 C++14 中,constexpr 函数可以包含多条语句,可以有条件语句(如 if)和循环语句(如 for、while),只要在编译时能够被求值为常量表达式即可。例如:

constexpr int factorial(int n) {
    int result = 1;
    for (int i = 1; i <= n; ++i) {
        result *= i;
    }
    return result;
}

constexpr int result = factorial(5);  // 在编译时计算出结果 120

3、函数返回类型推导

lambda表达式可以使用auto形参和返回类型,但普通函数不能使用auto形参。

虽然普通函数不能使用auto形参,但可以使用返回类型推导。在C++11中我们可以使用后置返回类型推导来完成这件事情:

//C++11中使用后置返回类型推导
auto add(int x, int y) ->decltype(x + y)
{
	return x + y;
}

而在C++14中,我们可以省略decltype,编译器直接由return语句的值推导出返回类型:

auto add(int x, int y)
{
	return x + y;
}

如果函数实现中含有多个 return 语句,这些表达式必须可以推断为相同的类型


auto PI(bool fract)
{
	if (fract) return 3.1416;
	else return 3;		//错误:推导出来的int与之前推导出来的double冲突
}

对于含有递归调用的函数,递归调用必须在第一个return之后

auto Correct(int i) 
{
	if (i == 1)
		return i; // 返回类型被推断为 int
	else
		return Correct(i-1)+i; // 正确,可以调用
}
 
auto Wrong(int i)
{
	if(i != 1)
		return Wrong(i-1)+i; // 不能调用,之前没有 return 语句
	else
		return i; // 返回类型被推断为 int
}

4、变量模版

C++14中,引入了一种称为变量模板的新的模板类型

#include <iostream>
#include <iomanip>
using namespace std;
// 函数模板
template<class T>
constexpr T pi_fn()
{
    return T(3.1415926535897932385);
}
// 变量模板
template<class T>
constexpr T pi = T(3.1415926535897932385);
 
int main()
{
   cout << pi_fn<int>() << pi<int> << '\n'; // 33
   cout << setprecision(10) << pi<float> << '\n'; // 3.141592741
   cout << setprecision(10) << pi<double> << '\n'; // 3.141592654
}

5、二进制字面值

二进制字面值可以使用0b或者0B开头来表示

int i = 0b0100010001;  // 273
int i = 0B0100010001;  // 273,大写B

6、数字分位符

C++14 引入单引号(’)作为数字分位符号,使得数值型的字面量可以具有更好的可读性

auto integer_literal = 100'0000;
auto floating_point_literal = 1.797'693'134'862'315'7E+308;
auto binary_literal = 0b0100'1100'0110;
auto silly_example = 1'0'0'000'00;

7、通过类型寻址多元组

C++11 引入的 std::tuple 类型允许不同类型的值的聚合体用编译期整型常数索引。C++14还允许使用类型代替常数索引,从多元组中获取对象。若多元组含有多于一个这个类型的对象,将会产生一个编译错误:

tuple<string, string, int> t("foo", "bar", 7);
int i = get<int>(t); // i == 7
int j = get<2>(t); // Same as before: j == 7
string s = get<string>(t); //Compiler error due to ambiguity

8、make_unique

std::make_unique 可以像 std::make_shared 一样使用,用于产生 std::unique_ptr 对象

std::unique_ptr<int> ptr = std::make_unique<int>(42);

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

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

相关文章

可维护的代码,高复用性之路:函数式编程带你飞

文章目录 I. 前言介绍函数式编程引言&#xff1a;为什么需要函数式编程 II. 函数式编程基础声明式编程和命令式编程比较纯函数&#xff1a;概念&#xff0c;优点和局限性不可变数据&#xff1a;概念&#xff0c;优点和局限性 III. 函数式编程优点易于理解和调试代码可以提高代码…

Matlab数学建模-典型相关分析

统计分析-典型相关分析 概念 典型相关分析是研究两个多变量&#xff08;向量&#xff09;之间之间的线性相关关系&#xff0c;能够揭示出两组变量之间的内在联系。 CCA(典型相关分析) 在一元统计分析中&#xff0c;用相关系数来衡量两个随机变量的线性相关关系&#xff0c;…

C++ 第三弹继承和多态-类和对象

目录 1.继承 1.1什么是继承&#xff1f; 1.2语法格式 1.3继承权限 1.4继承概念语法格式 1.5赋值兼容规则 1.6继承体系中的作用域 1.7在继承体系中的构造和析构 1.8静态成员继承 1.9友元的继承 1.10不同继承方式下子类的对象模型 1.11继承和组合 2.多态 2.1什么是…

分销架构总结

概述 对于过往分销系统的经验总结。视角上会不区分实物及虚拟服务的分销。 分销定义&#xff1a;将产品从生产者转移到消费者。 分销职责&#xff1a;获客&#xff0c;服务(售前&#xff0c;售中&#xff0c;售后)。核心是通过不同分销渠道将产品能卖出去。 在整体分销网络…

jjy-share-v1.0 一键分享到微博、QQ空间、QQ好友、微信,一键分享,一键分享代码,一键分享插件,一键分享代码插件

项目地址&#xff1a; jjy-share-v1.0: 一键分享到微博、QQ空间、QQ好友、微信作者&#xff1a; 极纪元-橙作者博客&#xff1a;https://cplvfx.blog.csdn.net/码云Gitee&#xff1a;https://gitee.com/cplvfx/时间&#xff1a;2023年6月21日 介绍 一键分享到微博、QQ空间、…

Qt下使用QPainter实现界面上饼状图、圆环图的绘制

文章目录 前言一、示例讲解二、圆环图绘制步骤三、设置圆环图数据四、示例完整代码五、下载链接总结 前言 前面的文章有讲述使用Qt下的Charts 模块来进行饼图的绘制&#xff1a;QChart实现ui界面上指定位置饼状图、圆环图的绘制&#xff0c;但是使用过程中并不能很好的实现自己…

Embedding 嵌入知识入门

原文首发于博客文章Embedding 嵌入知识入门 文本嵌入是什么 向量是一个有方向和长度的量&#xff0c;可以用数学中的坐标来表示。例如&#xff0c;可以用二维坐标系中的向量表示一个平面上的点&#xff0c;也可以用三维坐标系中的向量表示一个空间中的点。在机器学习中&#x…

强化学习从基础到进阶-案例与实践[4.1]:深度Q网络-DQN项目实战CartPole-v0

【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧&#xff08;调参、画图等、趣味项目实现、学术应用项目实现 专栏详细介绍&#xff1a;【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧…

Redis 原理

Redis 原理 动态字符串SDS Redis中保存的key时字符串&#xff0c;value往往是字符串或字符串集合&#xff0c;字符串是Redis中常见的数据结构 Redis没有直接使用C语言中的字符串&#xff0c;因为C语言字符串存在很多问题&#xff0c;使用起来不方便 Redis构建了一种新型的字…

Web网页制作-知识点(3)——HTML5新增标签、CSS简介、CSS的引入方式、选择器、字体属性、背景属性、表格属性、关系选择器

目录 HTML5新增标签 CSS简介 CSS概念 CSS的作用 语法 CSS的引入方式 内联样式&#xff08;行内样式&#xff09; 内部样式 外部样式&#xff08;推荐&#xff09; 选择器 全局选择器 元素选择器 类选择器 ID选择器 合并选择器 选择器的优先级 字体属性 …

Linux——文件基础IO的文件描述符和重定向实现理解

目录 前言&#xff1a; 首先来回顾一下open函数&#xff0c;即在进程中同时打开多个文件&#xff1a; Linux底层进程与文件的关系 &#xff1a; 二.重定向的实现 什么是重定向&#xff1f; 方法1&#xff1a; 2.1关闭stdin&#xff1a; 运行结果&#xff1a; ​编辑由结果知…

统计字符串数组中各元素中指定字符串出现的次数numpy.char.count()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 统计字符串数组中各元素中 指定字符串出现的次数 numpy.char.count() [太阳]选择题 下列代码最后输出的结果是&#xff1f; import numpy as np s np.array([I, Love, Python]) print("…

ChatGPT底层架构Transformer技术及源码实现(二)

ChatGPT底层架构Transformer技术及源码实现(二) Gavin大咖微信:NLP_Matrix_Space 3.2 图解Transformer精髓之架构设计、数据训练时候全生命周期、数据在推理中的全生命周期、矩阵运算、多头注意力机制可视化等 如图3-14所示,是Transformer编解码的示意图,中间有个关键内…

LFS11.3在VMware中安装后需要做的准备

参考lfs 11.3和Blfs 11.3 先简单罗列一下要做的步骤&#xff0c;后续有机会再补充一下细节&#xff0c;遇到问题欢迎读者留言。 1、配置vmware中的网络连接 使用vmware net8 net模式&#xff0c;选用VMnet 配置网络连接/etc/sysconfig/ 目录下ifconfig.*** &#xff08;***为…

fanuc机器人安装profinet IO基板产生报警

fanuc机器人安装profinet IO基板产生报警: SYST-302 请关闭电源 PRIO-397 PMIO 固件需要更新 %x %x 问题描述:新的R30iB‐Plus柜的GSDML 文件与R30iB柜的GSDML文件是不同的,GSDML文件与R834固件版本不匹配的话,会无法扫描到R834的卡,导致无法通讯 解决方法:确认 Expecte…

Diffusion Models: 方法和应用的综合调查 【01】Diffusion Models基础

Diffusion Models: 方法和应用的综合调查 【01】Diffusion Models基础 原文链接&#xff1a;Diffusion Models: 方法和应用的综合调查 【01】Diffusion Models基础 GitHub: https://github.com/YangLing0818/Diffusion-Models-Papers-Survey-Taxonomy. Paper&#xff1a; https…

MySQL学习基础篇(一)

一、数据库概述 1. 为什么要使用数据库 持久化(persistence)&#xff1a;把数据保存到可掉电式存储设备中以供之后使用。大多数情况下&#xff0c;特别是企业级应用&#xff0c;数据持久化意味着将内存中的数据保存到硬盘上加以”固化”&#xff0c;而持久化的实现过程大多通…

程序员编程效率的大敌:中断与上下文切换

程序员编程效率的大敌&#xff1a;中断与上下文切换 首先解释一下中断和上下文切换&#xff1a; 中断: 编程时被打断, 比如被聊天软件/电子邮件/电话/当面打断等&#xff1b;上下文切换&#xff1a;即任务的切换&#xff0c;有自己主动切换&#xff0c;有伴随中断的新任务&am…

C# 静态构造函数学习

静态构造函数用于初始化类中的静态数据或执行仅需一次的特定操作&#xff0c;静态构造函数将在创建第一个实例或引用类中的静态成员之前自动调用。 静态构造函数具有以下特点&#xff1a; 静态构造函数不使用访问权限修饰符修饰或不具有参数&#xff1b; 类或结构体中…

Proxmox VE 8 发布 - 开源虚拟化管理平台

Proxmox VE 8 发布 - 开源虚拟化管理平台 请访问原文链接&#xff1a;https://sysin.org/blog/proxmox-ve-8/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 宣布 Proxmox 虚拟环境的主要版本 8.0&#xff01;它基于出色的 De…