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

C++11新特性——auto和decltype类型推导

2016-11-28 22:01 363 查看
        C++11新标准引入auto类型说明符,可以让编译器帮我们分析表达式所属的类型,通过初始值推算变量的类型。auto定义的变量必须有初始值。使用auto也能在一条语句中声明多个变量。因为一条声明语句只能有一个数据类型,所以该语句中所有变量的基础数据类型必须相同。

        编译器推断出来的auto类型有时候和初始值的类型并不完全一样,编译器会适当的改变结果类型时期更符合初始化规则。比如,使用引用其实是使用引用的对象,特别是当引用被用作初始值时,真正参与初始化的其实是引用对象的值。此时编译器会以引用对象的类型作为auto的类型:

int i = 0,&r = i;
auto a = r; // a是一个整数(r是i的别名,i是一个整数)
        auto一般会忽略顶层const(top-levelconst),保留底层const(low-level const),顶层const指变量本身是个常量,而底层const指变量所指的对象是个常量。比如:

int i = 0;
int *const p1 =&i; // 不能改变p1的值,顶层const
const int ci =42; // 不能改变ci的值,顶层const
const int *p2 =&ci; // 可以改变p2的值,底层const
const int *constp3 = p2; // 前面是底层const,后面是顶层const
const int &r= ci; // 用于声明引用的const都是底层const
auto一般会忽略顶层const,保留底层const:

const int ci = i, &cr = ci;
auto b = ci; // b是一个整数(ci的顶层const被忽略)
auto c = cr; // c是一个整数(cr是ci的别名,ci本身是顶层const,被忽略)
auto d = &i; // d是一个整数指针
auto e = &ci; //e是一个指向整数常量的指针(对常量对象去地址是一种底层const)
如果希望推断出的auto类型是一个顶层const,需要明确指出:

const auto f = ci;

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

 

        decltype类型指示符:返回操作数的数据类型,不实际计算表达式的值。decltype处理顶层const和引用的方式与auto不同。如果decltype使用的表达式是一个变量,则返回该变量类型(包括顶层const和引用)。如果decltype使用的表达式不是一个变量则返回表达式结果对应的类型。如果表达式内容是解引用操作,则decltype将得到引用类型。如果变量名加上括号,则得到的类型与不加括号不同,不加括号返回变量的类型,加括号得到引用类型。切记:decltype((variable))(注意是双层括号)的结果永远是引用,而decltype(variable)结果只有当variable本身就是一个引用时才是引用。

        使用auto可以缩写类型,简化声明。

        auto可以和new配合,动态分配内存,并进行初始化,即括号内加初始化器。不可以使用auto来分配一个动态数组。这是因为使用new分配数组时,加括号初始化时,括号内不能有初始化器,而使用auto动态分配内存,需要提供一个括号包围的初始化器,且括号内只能有一个初始化器,从而推断出类型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: