类型推导 Auto Type
过去:
std::map<int, std::string>::const_iterator itr = q.find(3);
C++11:
auto itr = q.find(3);
使用auto简化迭代器遍历:
for (int i : v) {
std::cout << i << std::endl;
}
代码简洁了许多。但是,这里每次循环,会对i进行一次拷贝。此处i是一个int值,拷贝不会造成问题,但是如果是一个class,我们就更希望用引用的方式进行遍历,一般写成:
std::vector<string> v = { "a", "b" };
for(auto& s : v) {
std::cout << s << std::endl;
}
用auto&即可以变成引用方式遍历,甚至还能在循环中改变它的值。也可以使用const auto&,只是一般没有必要。
注意事项:
- auto 变量必须在定义时初始化,这类似于const关键字;
- 定义在一个auto序列的变量必须始终推导成同一类型;
- 如果初始化表达式是引用,则去除引用语义;
- 如果初始化表达式为const或volatile(或者两者兼有),则除去const/volatile语义;
const int a1 = 10;
auto b1= a1; //b1的类型为int而非const int(去除const)
const auto c1 = a1;//此时c1的类型为const int
b1 = 100;//合法
c1 = 100;//非法
- 如果auto关键字带上&号,则不去除const语意;(原实体的引用)
const int a2 = 10;
auto &b2 = a2;//因为auto带上&,故不去除const,b2类型为const int
b2 = 10; //非法
- 函数或者模板参数不能被声明为auto;
void func(auto a) //错误
{
//...
}
- 时刻要注意auto并不是一个真正的类型。
auto仅仅是一个占位符,它并不是一个真正的类型,不能使用一些以类型为操作数的操作符,如sizeof或者typeid
cout << sizeof(auto) << endl;//错误
cout << typeid(auto).name() << endl;//错误