类型别名、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本身就是一个引用时才是引用。
本文深入探讨C++中的类型别名、auto类型说明符和decltype类型指示符的使用,包括typedef、using声明、复合类型、顶层const、引用对象类型、decltype处理方式等关键概念。

999

被折叠的 条评论
为什么被折叠?



