您的位置:首页 > 编程语言 > C语言/C++

C++primer---constexpr、类型别名、auto、decltype

2017-07-29 21:53 246 查看
1、常量表达式是指指不会改变且在编译过程就能得到计算结果的表达式,字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式。

C++11规定,允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。

constexpr int mf = 20; //20是常量表达式

constexpr int limit = mf +1 ; //mf + 1是常量表达式

constexpr int sz = size(); //只有当size是一个constexpr函数时才是一条正确语句

2、类型别名

类型别名是一个名字,它是某种类型的同义词。定义类型别名的俩种方法:

1)使用关键字typedef

typedef double wages; //wages是double的同义词

typedef wages base,* p; //base是double的同义词,p是double * 的同义词

2)使用别名声明 把等号左侧名字规定成等号右侧类型的别名

using SI = Sales_itm; //SI是Sales_item的同义词

类型别名和类型的名字等价,只要是类型的名字出现的地方,就能使用类型别名

3、auto类型说明符

auto定义的变量必须有初始值,auto让编译器通过初始值来推算变量的类型。

auto item = val1 + val2; //通过val1+val2的结果,来判断item的类型

auto i = 0,*p = &i; //正确;i是整数、p是整形指针

auto sz = 0,pi = 3.14; //错误;sz和pi类型不一样

使用auto能在一条语句中声明多个变量,因为一条声明语句只能有一个基本数据类型,所以使用auto语句中所有变量的初始基本数据类型都必须一样。

auto i =0,*p= &i; //正确,i是整数,p是整形指针

auto sz = 0,pi = 3.14; //错误:sz和pi的类型不一致

4、decltype类型指示符

希望从表达式的类型推断出要定义变量的类型(返回操作数的数据类型),但是不想用该表达式的值初始化变量。

const int ci = 0,&cj = ci;

decltype(ci)x = 0; //x的类型是const int

decltype(cj)y = x; //y的类型是const int&,y绑定到x

decltype(cj) = z; //错误,z是一个引用,必须初始化,因为cj是一个引用,decltype(cj)的结果就是一个引用类型,作为引用的z必须被初始化

decltype的结果类型与表达式密切相关,对于decltype所用的表达式来说,如果变量名加上了一对括号,则得到的类型与不加括号时会有不同。如果decltype使用的是一个不加括号的变量,则得到的结果是该变量的类型;如果给变量加上一层或多层括号,编译器就会把它当成一个表达式

decltype((i))d; //错误:d是int&,必须初始化

decltype(i)e; //正确:e是一个(未初始化)int

注意:decltype((variable))(双层括号)的结果永远是引用,而decltype(variable)结果只有当variable本身就是一个引用时才是引用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: