原创 【博客大赛】《C++ Primer》学习笔记(五)变量别名、auto、decltype

2016-3-15 21:03 1044 10 10 分类: MCU/ 嵌入式 文集: Qt和Cpp
变量别名
----------------
变量别名可以使用typedef:
typedef double wages;

也可以使用using:
using SI = Sales_item;

变量别名和const结合,会产生有趣的结果:
typedef char *pstring;
const pstring cstr = 0;

cstr是指向char类型的常量指针,因为const要和base type结合。
这里,对象可以被更改,但cstr不可被更改。

typedef不是define,不能直接替代变量的内容。

auto
----------------
如果不能确定变量的类型,可以使用auto关键字,让编译器来确定。
因此被auto修饰的变量必须要被初始化:
auto item = val1 + val2;

此处,item可能是int、double、char或者类名。

auto会舍弃top-level的const,保留low-level的const。
就是说通过auto产生的变量,本身一般不是被const修饰的,除非指定它为const:
const auto f = ci;

关于auto、引用和指针的结合使用,还需要根据实际情况多加练习。

decltype
----------------
有时候,我们需要让编译器根据表达式来确定数据类型,但又不初始化这个变量。
这个时候就可以使用decltype关键字:
decltype(f()) sum = x;

函数f()并不会被调用,但是它的返回值类型会在这里被使用。

decltype不同于auto,它会完整的保留const。

int i = 42, *p = &i, &r = i;
decltype(r + 0) b;
decltype(*p) c;

decltype(r)是一个引用类型,而decltype(r + 0)是一个int类型。
decltype(*p)表示返回的将是一个引用,即int&。

还需要注意括号的使用:
decltype((i)) d; // 错误的表达,d是int&,必须被初始化。
decltype(i) e;   // 正确的表达,e是int。

不加括号,返回的是变量类型;
加了括号,返回的是表达式,赋值表达式会产生一个“=”左边的类型的引用。
这点对于理解((i))非常关键。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
10
关闭 站长推荐上一条 /3 下一条