初学者的C++11学习:auto和decltype

初学者的C++11学习:auto和decltype,第1张

初学者的C++11学习:auto和decltype

内容学习自,b站爱学习的大丙,CSDN Coco~567,CSDN weixin_39687359,详情可以转到他们的博客,本内容仅用作学习记录

1.在学习前先复习一下左值右值的概念

用户:Coco_567:

lvalues是指存在于单个表达式之外的对象。你可以把左值当成有名字的对象。

所有的变量,包括常变量,都是左值。左值变量能取地址。

rvalues是一个暂时存在的值存在于单个表达式之内的对象。

通俗来说就是,左值的生存期不只是这句话,后面还能用到它。

而右值呢,出了这句话就挂了,所以也叫(将亡值)。右值变量不能取地址(字符串字面值除外string)

如何判断表达式的左右值属性?

所有的值必属于左值、将亡值、纯右值三者之一。

纯右值:函数by value返回的局部变量 运算表达式产生的临时变量 原始字面量(string literal除外)和lambda。

将亡值:强制转换为Type&& 右值对象的成员变量

在函数argument——parameter匹配时,将亡值和纯右值都看做右值。

2.auto自动类型推导

2.1在C++11中auto不是一个实际的数据类型,只是一个类型声明的"占用符号",auto并不是万能的。

注意:使用auto前必须要先进行初始化,一边编译器能推导出它的类型,在编译时,将auto占位符替换成真正的类型。

auto a = 3.14;
auto y = 10;
auto z = 'a';
auto nb;//编译器报错
auto doubel sb;//编译器报错

auto和指针引用,const,volatile限定符等结合起来:

注意:变量不为指针或者引用的时候,最终结果不会保留const,volatile关键字。

2.2几个auto不能使用的场景

2.21不能作为参数使用,理由见2.1

2.22不能用于类的非静态成员变量初始化。

2.23不能用来定义数组

2.24无法使用auto推导出函数模板

例子:

template
struct test{
    T a;
    T b;
}

void main()
{
    test t;
    test t1 = t;//此处t1报错
}

2.3应用:

2.31用于stl容器遍历

以往遍历方式

map map1;
map ::iterator it1 = map1.begin();
for(;it != map1.end();++it)
{
    //迭代器遍历容器    
}

可改为

map map1;
auto it = map1.begin();
for(;it != map1.end();++it)
{
    //迭代器遍历容器    
}

2.32泛型编程的应用,增强了程序可读性和流程

 3.decltype

在某些时候,不需要或者不能定义变量,但是希望得到某类型,用这个关键字使得编译器在编译的时候推导出一个表达式的类型。decltype实在编译期完成的,只能用于表达式类型推导,不会计算值。而auto只能推导出已经初始化的变量类型。

int a = 5,b = 3;
decltype(a+b) c = 5;

3.1推导规则

3.11表达式为普通变量或者类表达式,这种情况下推导的类型和表达式的类型是一样的。

3.12表达式是函数调用,使用decltype推导出的类型和函数返回值一致。

例:

3.13表达式是一个左值,或者被括号包围,使用decltype推导出的是表达式类型的引用(如果有const,volatile限定符不能忽略)

例:

 

应用于容器:

 4.返回类型后置

在泛型编程中,当不确定返回值类型,需要通过参数的计算得到类型时,可以使用这个

例如:

 

 

输出虽然是7但是,返回值确实是double浮点型。暂且不知道原因,有人知道可以留言下吗?

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5702805.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存