IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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++ 类型推导 -> 正文阅读

[C++知识库]现代C++ 类型推导

C++类型推导,通常使用的是auto、decltype关键字来进行类型推导的,从而简化代码,方便编程,但是在获取方便的同时,我们需要对这些关键字有一些深入的了解。

一、获取函数的签名

__FUNCSIG__是MSVC下获取函数签名的宏,__PRETTY_FUNCTION__是GCC下获取函数签名的宏。

#ifdef __FUNCSIG__	 // MSVC
#define PrintSig  std::cout << __FUNCSIG__ << std::endl;
#else  // GCC
#define PrintSig std::cout << __PRETTY_FUNCTION__ << std::endl;
#endif

使用一个例子来测试获取函数的签名

template<typename T1,typename T2>
void Print(T1 a,T2 b)
{
   PrintSig;
}

// main函数调用
Print(1.0, 2u);

// 结果
void __cdecl Print<double,unsigned int>(double,unsigned int)

二、类型推导 - auto、decltype

1、构建一个int类型,一个const int类型,一个int&类型,一个const int& 类型。

	int i = 1;				// 左值
	const int c = 3;		// 常量
	int& r = i;				// 引用
	const int& rc = c;		// 常引用

// 我们使用C++的代码测试上述类型
	if (std::is_reference_v<const int&>)
		std::cout << "const int& is reference,";
	else
		std::cout << "const int& is not reference,";

	if (std::is_const_v<const int&>)
		std::cout << "const\n";
	else
		std::cout << "not const\n";

// 结果
const int& is reference,not const

为什么会出现const int& is reference,not const这种结果呢?

我通过查找资料,明白了为什么会出现这种现象,原因如下:

引用的const 限定符仅仅意味着不能通过引用参数修改值,但是它仍然可以被其他方法修改。

例子如下:

int a = 1;
const int &b = a;

std::cout << b << std::endl;  // Prints 1

a = 2;

std::cout << b << std::endl;  // Prints 2

所以我们不能假设const引用的值实际上是常数。

2、我们使用auto来推导上述类型

	auto a = i;				
	auto ac = c;			
	auto ra = r;			
	auto rca = rc;

// 构建判断类型是否属于const类型,先移除变量的引用
template<typename T>
constexpr bool IsConst = std::is_const_v<std::remove_reference_t<T>>;

decltype(i) k = 10;	    // decltype(i) 推导i的类型 相当于 int k = 10;

	if (std::is_reference_v<decltype(rca)>)
		std::cout << "rca is reference,";
	else
		std::cout << "rca is not reference,";

	if (IsConst<decltype(rca)>)
		std::cout << "const\n";
	else
		std::cout << "not const\n";
      
 // 结果
     rca is not reference,not const

decltype(i) k = 10; decltype(i) 推导i的类型,从上面的代码所知,i的类型为int,所以decltype(i)推导出i的类型为int,即上述代码为 int k = 10;

3、我们使用decltype(auto)来推导上述类型

	decltype(auto) da = i;
	decltype(auto) dac = c;
	decltype(auto) dra = r;
	decltype(auto) drca = rc;

if (std::is_reference_v<decltype(drca)>)
		std::cout << "rca is reference,";
	else
		std::cout << "rca is not reference,";

	if (IsConst_1<decltype(drca)>)
		std::cout << "const\n";
	else
		std::cout << "not const\n";
      
 // 结果
      rca is reference,const

为什么使用auto推断类型和使用decltype(auto)推断类型会有不同的结果,通过查阅资料发现auto与decltype(auto)是有一定的区别于联系的。

auto在表示类型时不会附带等号右侧类型的 ‘ & ’、‘ * ’ 以及顶层const,而decltype会附带表达式的 ‘ & ’、‘ * ’ 以及顶层const;

auto在遇到数组时,编译器会将其替换为一个指向数组首元素的指针,但是decltype不会;

以上是我对C++类型推导的一些理解,欢迎大家评论。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:13:21  更:2022-03-15 22:15:41 
 
开发: 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年11日历 -2024/11/24 5:01:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码