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本身就是一个引用时才是引用。
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本身就是一个引用时才是引用。
相关文章推荐
- C++11标准 类型别名 auto decltype 范围for循环等测试
- 类型别名,auto类型说明符,decltype类型指示符
- C++primer学习之:类型别名和auto
- C++学习笔记-const对象,类型别名,auto和decltype
- C++11新特性:类型别名,auto类型,decltype类型
- C++ 学习笔记(2)变量和基本类型(复合类型:引用、指针)、const、constexpr、typedef(using)、auto、decltype
- 2.5类型别名,auto, decltype
- C++11系列-改进的类型推导:auto、decltype和新的函数语法
- C++ 11 学习1:类型自动推导 auto和decltype
- 类型别名、auto类型说明符和decltype类型说明符初探
- c++11之auto自动类型推断和decltype类型获取
- auto decltype 用于返回值类型后置时的占位
- 类型别名+auto类型说明符+decltype类型说明符
- c++基础--auto类型说明符/decltype类型指示符
- C++11系列-改进的类型推导:auto、decltype和新的函数语法
- C++ 11 学习1:类型自动推导 auto和decltype
- C++11:"auto"和"decltype"类型说明符的思考
- C++11系列-改进的类型推导:auto、decltype和新的函数语法
- c++11——auto,decltype类型推导
- 类型别名 和 decltype