C++14中返回类型推导的使用

news2024/9/26 1:24:51

      使用C++14中的auto返回类型,编译器将尝试自动推导(deduce)返回类型:

namespace {

int xx = 1;
auto f() { return xx; } // return type is int
const auto& f3() { return xx; } // return type is const int&

auto multiply(int a, int b) { return (a * b); }
auto& increase(int& a) { a++; return a; }

} // namespace

int test_auto_14_1()
{
	int a = 4, b = 5;
	auto v1 = multiply(a, b);
	std::cout << "v1:" << v1 << "\n"; // v1:20

	auto& v2 = increase(a);
	std::cout << "v2:" << v2 << "\n"; // v2:5
	v2 = 10;
	std::cout << "a:" << a << "\n"; // a:10

	return 0;
}

      在C++14中使用lambda,可以使用auto推导其返回类型,这使得返回推导引用或右值引用成为可能:

namespace {

template <typename T>
auto& f2(T& t) { return t; }

} // namespace

int test_auto_14_2()
{
	// returns a reference to a deduced type
	auto g = [](auto& x) -> auto& { return f2(x); };
	int y = 123;
	int& z = g(y); // reference to y
	std::cout << "z:" << z << "\n"; // z:123
	z = 456;
	std::cout << "y:" << y << "\n"; // y:456

	return 0;
}

      decltype(auto)类型说明符(type-specifier)也像auto一样推导出一个类型。但是,它会在保留其引用和cv限定符(cv-qualifier)的同时推导返回类型,而auto则不会:

namespace {

decltype(auto) increase(int& a) { a++; return a; }

int xxx = 123;
auto f(const int& i) { return i; } // return type is "int"
static_assert(std::is_same<const int&, decltype(f(xxx))>::value == 0);
static_assert(std::is_same<int, decltype(f(xxx))>::value == 1);

decltype(auto) g(const int& i) { return i; } // return type is "const int&"
static_assert(std::is_same<const int&, decltype(g(xxx))>::value == 1);

int xx = 1;
decltype(auto) f2() { return xx; }  // return type is int, same as decltype(x)
static_assert(std::is_same<int, decltype(f2())>::value == 1);
decltype(auto) f3() { return(xx); } // return type is int&, same as decltype((x))
static_assert(std::is_same<int&, decltype(f3())>::value == 1);
//const decltype(auto)& f4(const int) { return xx; } // "const decltype(auto)&" is an error, decltype(auto) must be used on its own
												     // error:“decltype(auto)”不能与任何其他类型说明符组合

//auto f5(bool flag) {
//	if (flag) return 1;
//	else return 1.0; // error: 所有返回表达式必须推导为相同类型: 以前为“int”
//}

//class AA {
//	virtual auto g() { return 1; } // error: 虚成员函数不应具有含“auto”的返回类型
//};

} // namespace

int test_decltype_14_1()
{
	int a = 4;
	auto& v2 = increase(a);
	std::cout << "v2:" << v2 << "\n"; // v2:5
	v2 = 10;
	std::cout << "a:" << a << "\n"; // a:10

	return 0;
}

int test_decltype_14_2()
{
	const int x = 0;
	//x = 2; // error C3892: “x”: 不能给常量赋值
	auto x1 = x; // int
	x1 = 2;
	decltype(auto) x2 = x; // const int
	//x2 = 3; // error C3892: “x2”: 不能给常量赋值

	int y = 2;
	int& y1 = y;
	auto y2 = y1; // int
	y2 = 5;
	std::cout << "y:" << y << "\n"; // y:2
	decltype(auto) y3 = y1; // int&
	y3 = 10;
	std::cout << "y:" << y << "\n"; // y:10

	int&& z = 2;
	auto z1 = std::move(z); // int
	z1 = 5;
	std::cout << "z:" << z << "\n"; // z:2
	decltype(auto) z2 = std::move(z); // int&&
	z2 = 10;
	std::cout << "z:" << z << "\n"; // z:10

	return 0;
}

      windows下debug模式结果如下:

     

      (1).const decltype(auto)&是一个error,decltype(auto)必须单独使用,它不能与任何其它类型说明符组合。

      (2).函数返回类型为auto或decltype(auto):如果有多个return语句,它们必须全部推导出相同的类型,否则会编译error。

      (3).虚函数不能使用返回类型推导。

      C++11中auto的使用:https://blog.csdn.net/fengbingchun/article/details/51834927

      C+11中decltype的使用:https://blog.csdn.net/fengbingchun/article/details/52504519 

      GitHub:https://github.com/fengbingchun/Messy_Test

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

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

相关文章

【阅读论文】时间序列数据清洗:一项调查

文章目录 摘要一、引言A.问题陈述B.问题挑战C. 组织 二、基于平滑的清洗算法A.移动平均B.自动注册C.卡尔曼滤波模型D.总结和讨论 三、基于约束的混合算法A. 顺序依赖 (OD)B.序列相关性C.速度约束D.总结和讨论 四、基于统计的CLEANING算法A.最大似然B.马尔可夫模型C.二项抽样D.时…

基于51单片机设计的井下瓦斯监控系统

一、项目介绍 井下瓦斯监控系统是煤矿安全生产中非常重要的一部分,防止井下瓦斯爆炸事故的发生,保障煤矿工人的人身安全。由于地下环境特殊,需要特殊的监测系统来实时监测瓦斯浓度等关键指标,并及时报警以便采取措施进行处理。 瓦斯气体,又称沼气,是一种轻质烃类气体,…

基于的滤波器设计

一,带通滤波器设计指标。 1&#xff0c;中心频率。中心频率:通常定义为带通滤波器&#xff08;或带阻滤波器&#xff09;频率的几何平均值&#xff0c;在对数坐标下&#xff0c;即为两个3dB点之间的中点&#xff0c;一般用两个3dB点的算术平均来表示。滤波器通频带中间的频率&…

网工大题题型总结(1)-------网络安全方面考察

&#xff08;1&#xff09;2018年上半年 试题二 &#xff08;3&#xff09;常见的无线网络安全隐患有 IP 地址欺骗、数据泄露、(8)、(9)、双络通信被窃听等; 为保护核心业务数据区域的安全&#xff0c;网络管理员在设备①处部署(10)实现核心业务区域边界 防护;在设备②处部署…

C++11特性之左值引用和右值引用

3.1二者的对比之内置类型 内置类型的无名对象&#xff08;右值&#xff09;为纯右值&#xff0c;其值本身不可改变 int main() {int a10;const int b20;int& raa;//ok,左值引用const int& rbb;//ok&#xff0c;常性左值引用const int& crv30;//ok,也叫万能引用&a…

网络安全竞赛——综合靶机渗透测试ZHCS-2全过程解析教程

任务一:综合靶机渗透测试 任务环境说明: 服务器场景:ZHCS-2(关闭连接)服务器场景操作系统:版本不详扫描目标靶机将靶机开放的所有端口,当作flag提交(例:21,22,23) FLAG:22,80 扫描目标靶机将靶机的http服务版本信息当作flag提交(例:apache 2.3.4) FLAG: ligh…

Vue3 Hooks函数使用及封装思想

目录 一. 什么是hooks函数&#xff1f; 二、如何封装一个hooks函数 三、Hooks 常用 Demo &#xff08;1&#xff09;验证码倒计时 &#xff08;2&#xff09;防抖 &#xff08;3&#xff09;节流 一. 什么是hooks函数&#xff1f; 专业解释&#xff1a;Vue 3中的Hooks函数…

Nucleo-F411RE (STM32F411)LL库体验 8 - PWM的使用

Nucleo-F411RE &#xff08;STM32F411&#xff09;LL库体验 8 - PWM的使用 1、简述 LD2连接PA5&#xff0c;而PA5可以映射TIM2_CH1&#xff0c;配合TIM2&#xff0c;可以输出PWM。 本片文章大量工作是添加了shell命令&#xff0c;可以通过pwm命令开关pwm以及设置pwm的频率&am…

数字图像处理期末考点整理(全)

计算&#xff1a;傅里叶变换&#xff0c;双线性插值&#xff0c;直方图均衡化&#xff0c;灰度共生矩阵&#xff0c;霍夫曼编码&#xff0c;区域增长/合并&#xff0c;中值滤波 简答&#xff1a;窗口/模板处理&#xff0c;BMP文件存储格式&#xff0c;滤波器和平滑算子的特点&…

Servlet (上篇)

哥几个来学 Servlet 啦 ~~ 目录 &#x1f332;一、什么是 Servlet &#x1f333;二、第一个 Servlet 程序 &#x1f347;1. 创建项目 &#x1f348;2. 引入依赖 &#x1f349;3. 创建目录 &#x1f34a;4. 编写代码 &#x1f34b;5. 打包程序 &#x1f96d;6. 部署程序…

client-go的Indexer三部曲之二:性能测试

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文是《client-go的Indexer》系列的第二篇&#xff0c;在前文咱们通过实例掌握了client-go的Indexer的基本功能&#xff0c;本篇咱们尝试对下面这…

css小兔鲜项目搭建

目录 精灵图 精灵图的使用步骤 背景图片大小 background连写 文字阴影 盒子阴影 过渡 骨架标签 SEO三大标签 版心的介绍 css书写顺序 项目结构搭建 精灵图 场景&#xff1a;项目中将多张小图片&#xff0c;合并成一张大图片&#xff0c;这张大图片称之为精灵图 优点…

c语言实现 顺序存储和链式存储(几种链表)

目录 一、简介 二、一些问题 1、递归free 2、free单向循环链表&#xff1a; 3、free单向链表 4、free双向循环链表 5、free使用数组实现链式存储结构 6、sizeof&#xff08;&#xff09;求字符串大小的问题 三、总结 一、简介 花了几天的时间从头开始使用c语言…

UnityVR--UIManager--UI管理2

目录 前言 UIManger的实现 1. 需要用到的变量和数据 2. 在构造中的工作 3. 初始化面板 4. 显示面板 5. 隐藏面板和隐藏所有面板 6. 其他小工具 在场景中实现 1. 不同面板的类型设置 2. 场景中的设置 前言 接前篇&#xff0c;上一篇已经有了UITools.cs其中定义了UI面板需…

Web服务器群集:部署LAMP平台

目录 一、理论 1.LAMP平台 2.Apache网址服务基础 2.httpd服务器的基本配置 3.构建虚拟Web主机 4.MySQL服务 5.构建PHP运行环境 二、实验 1.LAMP架构DISCUZ论坛应用 三、问题 1.虚拟机内存分配上限问题&#xff0c;内存上限只能加到3G。 2.虚拟机CPU如何设置才更加合…

RISC-V 函数调用约定和Stack使用

RISC-V 函数调用约定和Stack使用 引言RISC-V vs x86RISC-V寄存器StackStruct补充函数调用约定寄存器约定函数跳转和返回指令的编程约定被调用函数的编程约定 RISC-V 汇编与 C 混合编程RISC-V 汇编调用 C 函数C 函数中嵌入 RISC-V 汇编 引言 MIT 6.S081 2020 操作系统 本文为M…

1744_Perl获取文件属性参数

全部学习汇总&#xff1a; GreyZhang/perl_basic: some perl basic learning notes. (github.com) 前阵子写通过Perl执行判断调用ImageMagick实现图像的批量压缩功能脚本时用到过这个功能&#xff0c;只是当时仅仅看了一个获取文件大小的功能。 今天看第六版的小骆驼书又看到了…

一篇十分硬核的QT开发经验文章!送给正在做QT开发或想从事QT开发的你

当编译发现大量错误的时候&#xff0c;从第一个看起&#xff0c;一个一个的解决&#xff0c;不要急着去看下一个错误&#xff0c;往往后面的错误都是由于前面的错误引起的&#xff0c;第一个解决后很可能都解决了。 定时器是个好东西&#xff0c;学会好使用它&#xff0c;有时…

别再为缓慢启动而失去用户! 让你的Android应用体验绝佳性能

为什么要启动优化&#xff1f; 启动优化是为了提升应用程序的启动性能&#xff0c;即减少应用程序从启动到可交互状态所需要的时间。以下是一些关键原因&#xff0c;解释了为什么启动优化是重要的&#xff1a; 用户体验&#xff1a; 启动时间是用户与应用程序互动的第一个体验…

常用API

文章目录 1、String类String概述创建对象的两种方式字符串的内容比较String常用APIString类开发验证码功能手机号码屏蔽功能 2、Object类Object类的作用Object类的常用方法**Object的toString方法**Object的equals方法 3、Objects类4、StringBuilder类5、Math类6、System类7、B…