类型别名、auto类型说明符和decltype类型指示符

本文深入探讨C++中的类型别名、auto类型说明符和decltype类型指示符的使用,包括typedef、using声明、复合类型、顶层const、引用对象类型、decltype处理方式等关键概念。

            类型别名、auto类型说明符和decltype类型指示符

1、类型别名

类型别名是一个名字,它是某种类型的同义词。

有两种方法可以用于定义类型别名。

1.1、使用关键字typedef

typedef double wages;
typedef wages base, *p;

1.2、使用别名声明using

using wages = double;
using base = wages;
using p = wages*;

2、auto类型说明符

C++11新标准引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。显然,auto定义的变量必须有初始值。

int i = 42;
int j = 20;
auto k = i + j;          // k的类型为i + j结果的类型,即int
auto sz = 0, pi = 3.14;  // 错误,一条声明语句只能有一个基本数据类型;sz和pi的类型不一致

2.1、复合类型、常量和auto

编译器推断出来的auto类型有时候和初始值的类型并不完全一致,编译器会适当的修改结果类型使其更符合初始值规则。

2.1.1、以引用对象的类型作为auto类型

使用引用其实是使用引用的对象,特别是当引用被用作初始值时,真正参与初始化的是引用对象的值。

int i = 42;
int &ri = i;
auto j = ri;  // j的类型是int

2.1.2、auto一般会忽略顶层const、保存底层const

int i = 42;
const int ci = i;
const int &cr = ci;
auto b = ci;   // b是一个整数(auto忽略顶层const)
auto c = cr;   // c是一个整数(cr是引用,ci是顶层const)
auto d = &i;   // d是一个整型指针
auto e = &ci;  // e是一个指向整型常量的指针

如果希望退出推断出的auto类型是顶层const,需要明确指出。

const int i = 0;
const auto f = i;  // f的类型为const int

设置一个类型为auto的引用时,初始值中的顶层const常量属性仍然保留。

int i = 42;
const int ci = i;
auto &j = ci;        // j的类型为const int引用
auto &k = 42;        // 错误:不能为非常量引用绑定字面值
const auto &m = 42;  // 正确:可以为常量引用绑定字面值 

3、decltype类型指示符

如果希望从表达式的类型推断出要定义的变量的类型,但是不想用该表达式的值初始化变量。则可以使用C++11新标准引入的decltype类型指示符。

decltype(func()) i = j;  // i的类型就是func()函数的返回值类型

上面的代码中,编译器并不会调用func()函数。

decltype处理顶层const和引用的方式与auto有些不同。如果decltype使用的表达式是一个变量,则decltype返回该变量的类型(包括顶层const和引用)。

const int ci = 0;
const int &cr = ci;
decltype(ci) x = 0;  // x的类型是const int
decltype(cr) y = x;  // y的类型是const int&,y绑定到x
decltype(cr) z;      // z的类型是const int&,必须初始化

如果decltype使用的表达式不是一个变量,则decltype返回表达式结果对应的类型。

如果表达式的内容是解引用操作,则decltype返回的是引用类型。

int i = 42;
int *p = &i;
int &ci = i;
declytpe(ci + 0) x;  // x的类型是int
decltype(p) y;       // y的类型是int*
decltype(*p) z = i;  // z的类型是int&

3.1、decltype和auto的区别

decltype和auto的一个重要区别是,decltype的结果类型与表达式形式密切相关。

有一种情况需要特别注意:如果变量名加上了一对括号,编译器会把它作为一个表达式,所以这样的decltype就会得到引用类型。

int i = 42;
decltype((i)) j = i;  // j的类型是int&
decltype(i) k;        // k的类型是int

注意:decltype((variable))的结果永远是应用。而decltype(variable)的结果只有当variable本身就是一个引用时才是引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值