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 : int
auto c = cr; // c : int
auto 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 int
decltype(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 int
decltype(*p) c; // error: c is int & and must be initialized
需要注意的是括号会影响产生的类型:
int i = 0;
decltype((i)) d; // error: d is int & and must be initialized
decltype(i) e; // ok
decltype((variable))总是返回引用类型。