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

2023-11-11

      使用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 

      GitHubhttps://github.com/fengbingchun/Messy_Test

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++14中返回类型推导的使用 的相关文章

随机推荐

  • VC++ UI布局管理器

    程序从codeproject上下载的 功能类似QT的QLayout 有了它界面缩放再也不会乱套了 具体使用方法可参考源码示例 资源下载链接地址 https download csdn net download u012156872 1926
  • PyTorch学习日志_20201031_数据并行处理

    日期 2020 10 31 主题 PyTorch入门 内容 根据PyTorch官方教程文档 学习如何使用数据并行 DataParallel 来使用多GPU 根据自己的理解和试验 为代码添加少量注解 具体代码如下 数据并行处理 导入和参数 i
  • c++——复制构造函数

    一 概述 复制构造函数作用 使用一个已经存在的对象去初始化同类的一个新对象 其形参是本类对象的引用 如果没有定义复制构造函数 编译器会在必要时自动生成一个隐含的复制构造函数 声明和实现复制构造函数 class 类名 public 类名 形参
  • Netty实战(八)引导

    引导 一 引导 1 1 什么是引导 1 2 Bootstrap 类 1 3 引导客户端和无连接协议 1 4 引导客户端 1 5 Channel 和 EventLoopGroup 的兼容性 二 引导服务器 2 1 ServerBootstra
  • Python:小数、百分比相互转化

    简介 实现小数和百分比相互转换 相关攻略 Python内置库 数据计算相关 math random 类型 主要分为以下5种情况处理 1 百分比转小数 2 小数转百分比 直接转可能存在尾数不足的情况 3 小数转百分比 注意是两个 4 小数转百
  • MySQL 中 MyISAM 与 InnoDB 引擎的区别

    分析 回答 区别很多 大家说出下面几点 面试就应该 OK 了 1 事务支持 MyISAM不支持事务 而InnoDB支持 InnoDB的AUTOCOMMIT默认是打开的 即每条SQL语句会默认被封装成一个事务 自动提交 这样会影响速度 所以最
  • KiCad使用笔记(03)-原理图绘制

    绘图过程 放置元件 绘制导线 编号元件 检查原理图 关联封装 生成网表 标题栏设置 相关视频教程 绘图过程 放置元件 放置元件可以点击右侧工具栏中放置元件 然后在工作区鼠标左键单击 在弹出的选项框中通过关键词搜索或是直接在下方列表中选择 可
  • ctf misc之MP3隐写

    2022 4 9 第一次写mp3隐写 走了好多坑记录一下 题目得到一个MP3文件和一个压缩包 然后听一遍这个歌发现最后面有一段非常违和的 用Audacity打开这个mp3 查找了一下MP3的隐写方法有以下几种 MP3编码隐写将数据隐藏在MP
  • 【Seata】00 - Seata Server 部署(Windows、Docker 基于 Jpom)

    文章目录 前言 参考目录 版本说明 Windows 部署 seata server 1 下载压缩包 2 文件存储模式 3 db 存储模式 3 1 建表 3 2 修改配置文件 3 3 启动脚本 4 源码部署 Docker 部署 seata s
  • Android MVP 框架搭建

    前言 本文主要根据自身项目的使用和对MVP的理解 搭建符合自身项目情况的MVP架构 关于MVP M Model 负责数据的请求 解析 过滤等数据操作 V View 负责处理UI 通常以Activity Fragment的形式出现 P Pre
  • 华为OD机试真题-打印文件

    题目描述 有5台打印机打印文件 每台打印机有自己的待打印队列 因为打印的文件内容有轻重缓急之分 所以队列中的文件有1 10不同的优先级一 其中数字越大优先级越高 打印机会从自己的待打印队列中选择优先级最高的文件来打印 如果存在两个优先级一样
  • 复旦微魔方FM33FR0xx——FL库笔记-定义

    fm33fr0xx h的定义 一 时钟定义 define RCHF INITIAL CLOCK 8000000 内部RC高频震荡器 8M define RCMF CLOCK 4000000 内部RC 4M振荡器 define LPOSC C
  • 判断考生成绩等级(switch case语句练习)

    判断考生成绩等级 1 考生成绩控制在 0 100 2 成绩 90 100 优 成绩 80 90 良 成绩 70 80 可 成绩 60 70 一般 成绩 0 60 不及格 要求使用switch语句 不能使用if语句 class SwitchT
  • 华为OD机试 - 区间交叠问题(Java)

    题目描述 给定坐标轴上的一组线段 线段的起点和终点均为整数并且长度不小于1 请你从中找到最少数量的线段 这些线段可以覆盖柱所有线段 输入描述 第一行输入为所有线段的数量 不超过10000 后面每行表示一条线段 格式为 x y x和y分别表示
  • 爬虫取中间文本_10 个爬虫工程师必备的工具

    阅读文本大概需要 6 分钟 工欲善其事必先利其器的道理相信大家都懂 而作为经常要和各大网站做拉锯战的爬虫工程师们 则更需要利用利用好身边的一切法器 以便更快的攻破对方防线 今天我就以日常爬虫流程 给大家介绍十款工具 相信大家掌握之后 必定能
  • 用java有理数类包含加减乘除_用java具体代码实现分数(即有理数)四则运算

    用java具体代码实现分数 即有理数 四则运算 1 背景 Java老师布置了一个关于有理数运算的题目 因为参考书上有基本代码 所以自己主要是对书上代码做了一点优化 使其用户交互性更加友好以及代码封装性更强 2 说明 分数也称作有理数 是我们
  • 解空间

    目录 一 解空间 二 解空间的相对性 三 解空间结构 四 解空间结构的相对性 五 对象空间 六 对象空间和解空间的关系 1 对象空间等于解空间 2 解空间是对象空间的子空间 3 解空间是对象空间的子空间构成的集合 4 解空间是对象空间 或其
  • 求二叉树的深度/求二叉树的节点数

    1 求二叉树的深度 高度 思路 递归解法 1 如果二叉树为空 则树的深度为0 递归返回条件 2 如果二叉树不为空 二叉树深度 max 左子树节点个数 右子树节点的个数 1 代码如下 二叉树节点的数据结构 class treeNode pub
  • C语言,判断二维字符数组是否存在回文字符串 例如:char a[] [10]={“asd“,“asa“,“werew“,“yuyu“};

    判断二维字符数组是否存在回文字符串 例如 char a 10 asd asa werew yuyu 提示存在回文字符串 回文字符串对称 思路 循环二维字符数组 判断每一个字符串是否是回文字符串 回文字符串使用单独函数 2 1 循环二维数组
  • C++14中返回类型推导的使用

    使用C 14中的auto返回类型 编译器将尝试自动推导 deduce 返回类型 namespace int xx 1 auto f return xx return type is int const auto f3 return xx r