我们经常会将表达式的值赋给变量,这就要求在变量声明时清楚地知道表达式的类型。有时候是很复杂的一件事,在C++11中引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。当然,auto变量必须有初始值,这样编译器才能推断其类型:
double val1 = 1.1, val2 = 2.2; auto item = val1 + val2; // item为double类型
auto i0 = 0, *pI = &i0; // ok, i0为int类型, p为int指针 auto sz = 0, pi = 3.14; // fail, sz和pi类型不一致
编译器推断出来的auto类型有时候和初始值类型不完全一致,编译器会适当的改变结果类型使其更符合初始化规则。
引用:使用引用实际上使用的是引用的对象,当引用被用作初始化时,真正参与初始化的其实是引用对象的值。此时,编译器以引用对象的类型作为auto的类型:
int i = 0, &r = i; auto a = r; // a是一个int,r是i的别名,而i是一个int
const int ci = i, &cr = ci; auto b = ci; // b是一个int,ci的顶层const被忽略 auto c = cr; // c是一个int,cr的顶层const被忽略 auto d = &i; // d是一个int型指针 auto e = &ci; // e是一个指向整型常量的指针,对常量对象取地址是一种底层const
const auto f = ci;
auto &g = ci; // g是一个整型常量引用,绑定到ci auto &h = 42; // error, 不能为非常量引用绑定字面值 const auto &j = 42; // ok,可以为常量引用绑定字面值
auto k = ci, &l = i; // k是int, l是int& auto &m = ci, *p = &ci; // m是对整型常量的引用,p是指向整型常量的指针 auto &n = i, *p2 = &ci; // error, n是对整型的引用,p2是指向整型常量的指针
const int i = 42; auto j = i; // j是int const auto &k = i; // k是int i的常量引用 auto *p = &i; // p是指向整型常量i的指针 const auto j2 = i, &k2 = i; // j2是整型常量, k2是int i的常量引用
原文地址:http://blog.csdn.net/yamingwu/article/details/46003169