C++Primer第五版【学习笔记】——auto,decltype【C++11】

来源:互联网 发布:网络段子里的老司机 编辑:程序博客网 时间:2024/05/17 04:52

1. auto

我们经常会需要将表达式的值保存在变量中。要声明变量,我们需要知道表达式的类型。但是要确定表达式的类型,有时候是很困难的。C++11新标准引入了auto类型声明符,使变量的类型由编译器通过表达式的推测来确定。比如:

auto avalue = value1 + value2;

如果value1和value2为double类型,则avalue为double类型。如果value1和value2为int类型,则avalue也为int类型。

如果使用引用来初始化auto类型,则该变量的类型为引用绑定对象的类型。

int i = 0, &ri = i;auto a = ri; // a的类型为int

auto声明一般会忽略掉顶级(top-level)const,而低级const则会保留。

int i = 0;const int ci = i, &cr = ci;auto b = ci; // b : intauto c = cr; // c : intauto d = &i; // d : int *auto e = &ci; // e : const int *

如果要声明为顶级const,则需要显式定义:

const auto f = ci; // f : const int

当定义一个auto类型的引用时,初始化中的顶级const会保留,因为引用绑定到带const的类型,其实是低级const。

auto &g = ci; // g: const int &auto &h = 42; // error: 不能将普通的引用绑定到一个字面值const auto &j = 42; // ok: 可以将const引用绑定到字面值const auto &k = ci; // k : const int &const

2.decltype

有时,我们想将变量的类型定义为某个表达式的类型,但是又不想用该表达式初始化这个变量(auto就是必须初始化)。新规则中引入了类型decltype,来解决这个问题。

decltype(f()) dv; //使用函数f()返还值得类型来定义dv

decltype处理top-level const和引用的方法与auto不同,顶级const和引用不会忽略。

const int ci = 0, &rci = ci;decltype(ci) x = 0; // x : const intdecltype(rci) y = x; // y : const int &decltype(rci) z; // error, z为const int & 没有初始化

decltype与引用

如果作用于decltype的不是一个变量,则会产生表达式的类型。一些表达式会使decltype产生引用类型。一般来说,当表达式产生的对象可以作为左值(可以出现在赋值语句的左边)时,decltype返回引用类型。

int i = 42, *p = &i, &r = i;decltype(r + 0) b; // ok: addition yields an intdecltype(*p) c; // error: c is int & and must be initialized

需要注意的是括号会影响产生的类型:

int i = 0;decltype((i)) d; // error: d is int & and must be initializeddecltype(i) e; // ok

decltype((variable))总是返回引用类型。